2016-12-17 4 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(); 

답변

0

Wait은하고 Release 증가를 감소시킵니다.

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)