2010-07-10 9 views
3

나는이 질문을하기 전에 물어 보았습니다. 그러나 그것에 대해 생각하고 시간을 보냈습니다.스레딩 만 첫 번째 스레드를 차단합니다 (시도 2)

개요
1) 스레드는 특정 작업을 수행하기 위해 생성됩니다.
2) 한 번에 하나의 스레드 만 작업을 수행 할 수 있습니다.
3) 각 스레드는 똑같은 작업을 수행합니다. (시스템에서 수표와 검증을 수행합니다.)
3) 스레드가 작업 수행보다 빠르게 생성되고 있습니다. (스레드 작성에 대한 제어권이 없습니다)

결과 초과 근무로 인해 작업을 수행하기위한 스레드 백 로그가 발생합니다.

구현 한 내용은 다음과 같습니다.
1) 스레드는 활성 스레드의 수를 확인합니다.
2)가이 PerformTask에 표시된 0 스레드는 그것이 스레드가 더 1 개 스레드가 아닌 있으면 PerformTak 및 차단
4)로 표시되는 하나의 스레드가 존재하는 경우)는 태스크
3 시작하면 PerformTasks 및 그냥 죽을 표시되지 않은

아이디어는 스레드가 이미 작업을 수행하기 위해 대기중인 경우 스레드를 죽일 뿐이라는 것입니다. 여기

내가

   bool tvPerformTask = false; 

       ivNumberOfProcessesSemaphore.WaitOne(); 
       if (ivNumberOfProcessesWaiting == 0 || 
        ivNumberOfProcessesWaiting == 1) 
       { 
       ivNumberOfProcessesWaiting++; 
       tvPerformTask = true; 
       } 
       ivNumberOfProcessesSemaphore.Release(); 

       if (tvPerformTask) 
       { 
       //Here we perform the work 
       ivProcessSemaphore.WaitOne(); 
       //Thread save 

       ivProcessSemaphore.Release(); 


       ivNumberOfProcessesSemaphore.WaitOne(); 
       ivNumberOfProcessesWaiting--; 
       ivNumberOfProcessesSemaphore.Release(); 
       } 
       else 
       { 
       //we just let the thread die 
       } 

나는 그것이 내가 코드를 찾을 수없는 단지이다 작동하지 않습니다하지 않습니다이 문제와 함께 제공되는 코드입니다 우아한 특별히 나는 매우 행복하지 않다 모든 것을 제어하기 위해 2 개의 세마포어와 정수를 필요로합니다. 이 코드를 구현하는 방법이 있다면 코드를 더 간단하게 만들 수 있습니다.

답변

1

어때?

private readonly _lock = new object(); 
private readonly _semaphore = new Semaphore(2, 2); 

private void DoWork() 
{ 
    if (_semaphore.WaitOne(0)) 
    { 
     try 
     { 
      lock (_lock) 
      { 
       // ... 
      } 
     } 
     finally 
     { 
      _semaphore.Release(); 
     } 
    } 
} 
+0

+1 문제를 해결하지 못하는 것 같습니다. 좋은 해결책! –

+0

이렇게하면 모든 스레드가 작업을 수행하게됩니다. 스레드의 백 로그가 있으면 스레드를 삭제하기 만하면됩니다. 세마포어가 스레드를 차단하는지 확인하는 방법이 있습니까? 세마포어 블록을 그냥 스레드를 삭제할 수 있습니다. –

+0

@ 존 : 아니, 그렇지 않을 것이다. '_semaphore.WaitOne (0)'이'false'를 반환하면, 그것은 공연 하나와 대기 중 하나라는 것을 의미하므로 단순히 종료됩니다. –

0

독자적으로 개별 스레드의 생성 및 삭제를 관리하는 대신 ThreadPool을 사용해보십시오.

+0

스레드 작성을 제어 할 수 없습니다. 나는 시스템의 다른 부분에서 호출되는 작업을 수행하기 위해 클래스를 구현하고있다. –

+0

... 나는이 같은 라인을 생각해 보았다. 시스템이 처리 할 수있는 것보다 작업 부하가 높을 때 너무 많은 스레드를 생성하지 않도록하기 위해 일부 논리와 결합했다. –

+0

이것은 수정 후 ... –

관련 문제