我正在學習c#信號量並且不理解一點。我可以這樣初始化信號燈:信號量:瞭解請求的初始和最大數量
var semaphore = new Semaphore(4, 6);
有很多地方這樣的解釋:
如果你想保留一些插槽調用線程,你可以通過第一個參數做 這樣比第二小。
這是否意味着只有主線程可以使用剩餘的2個資源插槽?是否這意味着如果我這樣寫:
var semaphore = new Semaphore(0, 6);
只有主線程可以使用全部6個插槽?
我正在學習c#信號量並且不理解一點。我可以這樣初始化信號燈:信號量:瞭解請求的初始和最大數量
var semaphore = new Semaphore(4, 6);
有很多地方這樣的解釋:
如果你想保留一些插槽調用線程,你可以通過第一個參數做 這樣比第二小。
這是否意味着只有主線程可以使用剩餘的2個資源插槽?是否這意味着如果我這樣寫:
var semaphore = new Semaphore(0, 6);
只有主線程可以使用全部6個插槽?
與鎖(監視器)和互斥鎖不同,信號量沒有「所有者」 - 它是線程無關的。任何線程都可以在信號量上調用Release,而使用Mutex和鎖定時,只有獲得鎖的線程才能釋放它。
初始值可用於初始化可同時授予的信號量請求數。它會爲相關的sempahore設置當前可用的併發級別。
儘管最大計數可以設置可同時授予的信號量請求的最大數量。它爲相關信號量設置了最大的潛在併發性。
您不能增加計數器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
旗號就像一個夜總會:它有一定的能力,由保鏢執行。一旦它滿了,沒有更多的人可以進入,並在外面建立一個隊列。然後,對於每個離開的人,一個人從隊列的頭部進入。構造函數至少需要兩個參數:夜總會當前可用的地方數量和俱樂部的總容量。
好的,但剩下的2個插槽呢? – mtkachenko 2014-10-05 13:49:42
@ maxim.tkachenko他們可以從其他線程使用,我更新了答案,並放置了一個示例,顯示信號量如何與線程無關 – user3473830 2014-10-05 13:54:38
對不起,可能我的答案不明確。如果我使用「新的Semaphore(4,6)」 - 只有4個線程可以同時工作?當其他兩個線程可用時? – mtkachenko 2014-10-05 14:02:11