2016-12-17 148 views
0

我剛開始學習SemaphoreSlim但是在這個程序中semaphore.CurrentCount是如何增加和減少的呢?據我瞭解,當調用semaphore.Wait()時,釋放計數器遞減1,當semaphore.Release()時,允許執行兩個線程,但semaphore.CurrentCount如何遞增?它是從0還是1開始的?semaphore.CurrentCount在這種情況下如何工作?

 var semaphore = new SemaphoreSlim(2, 10); 
     for (int i = 0; i < 20; i++) 
     { 
      Task.Factory.StartNew(() => 
      { 
       Console.WriteLine("Entering task " + Task.CurrentId); 
       semaphore.Wait(); //releasecount-- 
       Console.WriteLine("Processing task " + Task.CurrentId); 
      }); 
     } 

     while (semaphore.CurrentCount <= 2) 
     { 
      Console.WriteLine("Semaphore count: " + semaphore.CurrentCount); 
      Console.ReadKey(); 
      semaphore.Release(2); 
     } 
     Console.ReadKey(); 

回答

1

信號量就像一個有一定容量的房間。通過SemaphoreSlim,您可以指定初始容量和最大容量。達到最大值後,無人再進入房間。每個離開房間的物品,只允許一個進入。

CurrentCount獲取可以進入房間的剩餘線程數。

for (int i = 0; i < 20; i++) 
    { 
     Task.Factory.StartNew(() => 
     { 
      Console.WriteLine("Entering task " + Task.CurrentId); 
      semaphore.Wait(); //only from 2 - 10 threads can be at the time 
      Console.WriteLine("Processing task " + Task.CurrentId); 
     }); 
    } 

這裏

while (semaphore.CurrentCount <= 2) 

如果在那一刻,剩餘的線程數小於2,那麼你在房間裏釋放兩個空間

相關問題