Java의 Object.wait()은 "가짜 웨이크 업"에 대해 경고하지만 C#의 Monitor.wait()은 전혀 언급하지 않는 것 같습니다.C# Monitor.Wait()에서 가짜 웨이크 업이 발생합니까?
Mono가 Linux 위에 구현 된 방법을보고 Linux에 spurious wakeups이있는 것을보고이 내용을 어딘가에 문서화해서는 안됩니까?
Java의 Object.wait()은 "가짜 웨이크 업"에 대해 경고하지만 C#의 Monitor.wait()은 전혀 언급하지 않는 것 같습니다.C# Monitor.Wait()에서 가짜 웨이크 업이 발생합니까?
Mono가 Linux 위에 구현 된 방법을보고 Linux에 spurious wakeups이있는 것을보고이 내용을 어딘가에 문서화해서는 안됩니까?
Joe Duffy의 "Concurrent Programming On Windows"에는 (P311-312, P598)이 언급되어 있습니다. 이 비트는 재미있다 :
위의 모든 예제에서, 스레드가 가짜 웨이크 업이라고 뭔가를 탄력적이어야합니다-이 조기 각성되는 경우 조건 변수도 경우에 정확하고 활기찬 남아 있어야 사용하는 코드 즉, 조건이 수립되기 전에. 이것은 구현이 실제로 그런 일을하기 때문에 (자바와 Pthread와 같은 다른 플랫폼의 일부 구현은 그렇게하는 것으로 알려져 있지만) 코드가 불필요 할 때 의도적으로 쓰레드를 깨우지 않기 때문에가 아니라, 각성 된 스레드가 스케줄 될 때를 보장합니다. 조건 변수가 공평하지 않습니다. 잠에서 깨어 난 스레드가 잠금을 다시 획득하고 중요한 영역으로 돌아 가기 전에 또 다른 스레드가 관련 잠금을 획득하고 조건을 다시 거짓으로 만들 가능성이 있습니다.
그런 다음 그는 조건을 테스트하는 while 루프에 대한 일반적인 패턴을 제공합니다.
나는이에서이 Monitor.Wait
이 일반적으로 조기에 당신을 깨워하지 않을 것으로 예상하는 것이 타당하다고 말할 것입니다, 당신은 절대적으로 다른 아무것도 조건을 변경되지 않은 수를 알고 있다면 다음 이 할 수있을 수도 조건 루프없이 도망 가라.하지만 논리가 부정확 한 경우에 대비하여 어쨌든 그것을 포함하는 것이 더 안전하다.
허위 모닝콜에 대한 아주 좋은 설명. 감사! – Gili
조와 직접 확인하여 내 외삽 법이 올바른지 확인합니다. –
조는 그 얘기를 들었습니까? 동일한 책의 207 페이지에서 그는 CLR이 모니터링 호출을 차단하는 것을 포함하여 차단할 때마다 공통 (경고 가능) 대기 루틴을 사용한다고 설명합니다. 이것은 당신이 언급 한 '명백한'허위 모닝콜 이외에 비동기 프로 시저 호출에 의한 '진정한'최고의 웨이크 업의 대상이 될 수 있음을 의미합니까? –
'문서화해야하는'.NET 동작의 * 많은 *이 있지만 슬프게도 없습니다. –