2014-10-05 40 views
0

我正在學習c#信號量並且不理解一點。我可以這樣初始化信號燈:信號量:瞭解請求的初始和最大數量

var semaphore = new Semaphore(4, 6); 

有很多地方這樣的解釋:

如果你想保留一些插槽調用線程,你可以通過第一個參數做 這樣比第二小。

這是否意味着只有主線程可以使用剩餘的2個資源插槽?是否這意味着如果我這樣寫:

var semaphore = new Semaphore(0, 6); 

只有主線程可以使用全部6個插槽?

回答

1

與鎖(監視器)和互斥鎖不同,信號量沒有「所有者」 - 它是線程無關的。任何線程都可以在信號量上調用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

+0

好的,但剩下的2個插槽呢? – mtkachenko 2014-10-05 13:49:42

+0

@ maxim.tkachenko他們可以從其他線程使用,我更新了答案,並放置了一個示例,顯示信號量如何與線程無關 – user3473830 2014-10-05 13:54:38

+0

對不起,可能我的答案不明確。如果我使用「新的Semaphore(4,6)」 - 只有4個線程可以同時工作?當其他兩個線程可用時? – mtkachenko 2014-10-05 14:02:11

0

我喜歡Albahari's explanation

旗號就像一個夜總會:它有一定的能力,由保鏢執行。一旦它滿了,沒有更多的人可以進入,並在外面建立一個隊列。然後,對於每個離開的人,一個人從隊列的頭部進入。構造函數至少需要兩個參數:夜總會當前可用的地方數量和俱樂部的總容量。