[英]Semaphore: understanding initial and maximum number of requests
我正在學習 c# semaphore 並且不明白一點。 我可以像這樣初始化信號量:
var semaphore = new Semaphore(4, 6);
很多地方都有這樣的解釋:
如果要為調用線程保留一些插槽,可以通過使第一個參數小於第二個參數來實現。
這是否意味着只有主線程可以使用剩余的 2 個資源槽? 這是否意味着如果我這樣寫:
var semaphore = new Semaphore(0, 6);
只有主線程可以使用所有 6 個插槽?
我喜歡Albahari 的解釋:
信號量就像夜總會:它有一定的容量,由保鏢強制執行。 一旦滿了,就沒有更多的人可以進入,外面就排起了長隊。 然后,對於每個離開的人,一個人從隊列的頭部進入。 構造函數至少需要兩個參數:夜總會當前可用的位置數量和俱樂部的總容量。
與鎖(監視器)和互斥鎖不同,信號量沒有“所有者” ——它與線程無關。 任何線程都可以在 Semaphore 上調用 Release,而對於 Mutex 和 lock,只有獲得鎖的線程才能釋放它。
初始值可用於發起可並發授予的信號量請求數。 它為相關信號量設置當前可用的並發級別。
而最大計數設置可以同時授予的信號量的最大請求數。 它為相關信號量設置了最大的潛在並發性。
您不能將計數器CurrentCount
大於您在初始化中設置的最大計數。
以下示例顯示了信號量如何與線程無關:
private static Semaphore semaphore = new Semaphore(3, 6);
private static void Main(string[] args)
{
//semaphore.Release(); //openning another slot for concurreny
semaphore.WaitOne();
Console.WriteLine("main0");
new Thread(() =>
{
semaphore.WaitOne();
Console.WriteLine("thread0");
semaphore.WaitOne();
Console.WriteLine("thread1");
Thread.Sleep(3000);
Console.WriteLine("uncomment the release line to make main1 get in");
}).Start();
Thread.Sleep(1000);
semaphore.WaitOne();
Console.WriteLine("main1");
Console.ReadKey();
}
有關更多信息,請查看http://www.albahari.com/threading/part2.aspx#_Semaphore
與互斥體不同,信號量可以在任何線程中使用 Release() 和 WaitOne()。 WaitOne() — 信號量遞減的計數器。 如果 counter == 0,則阻塞直到它增加。 Release() — 以信號量遞增的計數器。 第二個構造函數參數 == 計數器,阻塞直到它減少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.