나는이 질문을하기 전에 물어 보았습니다. 그러나 그것에 대해 생각하고 시간을 보냈습니다.스레딩 만 첫 번째 스레드를 차단합니다 (시도 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 문제를 해결하지 못하는 것 같습니다. 좋은 해결책! –
이렇게하면 모든 스레드가 작업을 수행하게됩니다. 스레드의 백 로그가 있으면 스레드를 삭제하기 만하면됩니다. 세마포어가 스레드를 차단하는지 확인하는 방법이 있습니까? 세마포어 블록을 그냥 스레드를 삭제할 수 있습니다. –
@ 존 : 아니, 그렇지 않을 것이다. '_semaphore.WaitOne (0)'이'false'를 반환하면, 그것은 공연 하나와 대기 중 하나라는 것을 의미하므로 단순히 종료됩니다. –