2016-12-17 3 views
0

私はちょうどSemaphoreSlimの学習を始めましたが、このプログラムではどのようにセマフォーカウントが増減しますか?私が理解しているように、semaphore.Wait()が呼び出されると、リリースカウンタは1ずつ減り、semaphore.Release()のときには2つのスレッドが実行されますが、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(); 

答えて

0

WaitはそれとRelease刻み、それをデクリメント。

1

セマフォは、一定の容量を持つ部屋のようなものです。 SemaphoreSlimでは、初期容量と最大値を指定しています。最大に達した後、もう誰も部屋に入ることはできません。部屋から出るすべてのアイテムごとに1つだけが入力できます。

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); 
     }); 
    } 

そして、その時に残っているスレッドの数が、その後、以下の2は、あなたが部屋にある2つのスペースを解放しているであれば、ここで

while (semaphore.CurrentCount <= 2) 

関連する問題