..AutoResetEvent - 두 건의 호출이 빠르게 스레드 릴리즈를 보장하지 않습니다 - 왜?
는 "중요 : 는 설정 방법에 대한 모든 호출이 스레드를 발표 할 예정이다 보장이 없습니다 두 통화가 서로 너무 가까이 있다면, 그래서. 두 번째 호출은 스레드가 해제되기 전에 발생하고 하나의 스레드 만 해제되며 두 번째 호출은 발생하지 않은 것처럼 동작하며 대기중인 스레드가없고 AutoResetEvent가 이미 신호를 받으면 Set이 호출되면 호출 효과가 없다. "
그러나이 경고는 기본적으로 그러한 스레드 동기화 기술을 갖는 이유를 없애줍니다. 예를 들면 나는 일자리를 잡을 목록을 가지고있다. 그리고 목록에 일자리를 추가 할 생산자는 단 한 명뿐입니다. 나는 .. 이런 식으로 뭔가를 목록에서 작업을 얻기 위해 기다리고, 소비자 (이상 1보다)이 ..
프로듀서 :
void AddJob(Job j)
{
lock(qLock)
{
jobQ.Enqueue(j);
}
newJobEvent.Set(); // newJobEvent is AutoResetEvent
}
소비자
void Run()
{
while(canRun)
{
newJobEvent.WaitOne();
IJob job = null;
lock(qLock)
{
job = jobQ.Dequeue();
}
// process job
}
}
하는 경우 위의 경고는 사실입니다. 그런 다음 두 개의 작업을 매우 빠르게 대기열에 넣으면 단 하나의 스레드 만 작업을 선택합니다. 그렇지 않습니까? 내가 설정은 원자 될 것이라는 가정하에 있었다, 즉, 다음을 수행입니다 :
- 가 이벤트를 다시 스레드가 대기하는 경우,
- 을 깨워 하나 개의 스레드를 선택
- 이벤트를 설정
- 선택한 스레드를 실행하십시오.
그래서 기본적으로 MSDN의 경고에 대해 혼란스러워합니다. 그것은 유효한 경고입니까?
예,이 코드만이 일을하려고 정확히 않는 .NET 4.0에 도입 우연히. 많은 바퀴벌레, 구글 'C# 생산자 소비자 대기열'을 많이 만들지 마십시오. –
생산자 소비자 중 대부분이 검색을 찾았으며 대기/신호 접근 방식을 사용합니다. 그 접근 방식의 문제점은 제가 노동자를 그만두기를 원할 때 나는 가짜 일자리를 제출해야한다는 것입니다. 그러나 이벤트를 사용할 수 있다면 작업자가 두 가지 이벤트를 기다리게 할 수 있습니다. 하나는 작업을하고 다른 하나는 종료합니다. 기분이 더 깨끗해 .. – cgcoder