2009-09-22 2 views

답변

64

Joe Duffy의 "Concurrent Programming On Windows"에는 (P311-312, P598)이 언급되어 있습니다. 이 비트는 재미있다 :

위의 모든 예제에서, 스레드가 가짜 웨이크 업이라고 뭔가를 탄력적이어야합니다

-이 조기 각성되는 경우 조건 변수도 경우에 정확하고 활기찬 남아 있어야 사용하는 코드 즉, 조건이 수립되기 전에. 이것은 구현이 실제로 그런 일을하기 때문에 (자바와 Pthread와 같은 다른 플랫폼의 일부 구현은 그렇게하는 것으로 알려져 있지만) 코드가 불필요 할 때 의도적으로 쓰레드를 깨우지 않기 때문에가 아니라, 각성 된 스레드가 스케줄 될 때를 보장합니다. 조건 변수가 공평하지 않습니다. 잠에서 깨어 난 스레드가 잠금을 다시 획득하고 중요한 영역으로 돌아 가기 전에 또 다른 스레드가 관련 잠금을 획득하고 조건을 다시 거짓으로 만들 가능성이 있습니다.

그런 다음 그는 조건을 테스트하는 while 루프에 대한 일반적인 패턴을 제공합니다.

나는이에서이 Monitor.Wait 일반적으로 조기에 당신을 깨워하지 않을 것으로 예상하는 것이 타당하다고 말할 것입니다, 당신은 절대적으로 다른 아무것도 조건을 변경되지 않은 수를 알고 있다면 다음 할 수있을 수도 조건 루프없이 도망 가라.하지만 논리가 부정확 한 경우에 대비하여 어쨌든 그것을 포함하는 것이 더 안전하다.

+0

허위 모닝콜에 대한 아주 좋은 설명. 감사! – Gili

+0

조와 직접 확인하여 내 외삽 법이 올바른지 확인합니다. –

+0

조는 그 얘기를 들었습니까? 동일한 책의 207 페이지에서 그는 CLR이 모니터링 호출을 차단하는 것을 포함하여 차단할 때마다 공통 (경고 가능) 대기 루틴을 사용한다고 설명합니다. 이것은 당신이 언급 한 '명백한'허위 모닝콜 이외에 비동기 프로 시저 호출에 의한 '진정한'최고의 웨이크 업의 대상이 될 수 있음을 의미합니까? –