2016-12-17 104 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,那么你在房间里释放两个空间

相关问题