2011-08-10 5 views
1

대 난에 RegisterWaitForSingleObject에 읽은 : http://www.albahari.comRegisterWaitForSingleObject가 AutoResetEvent

내가 RegisterWaitForSingleObject AutoResetEvent를 사용하지 선호 때 이해가 안 돼요?

우리는 항상 RegisterWaitForSingleObject를 사용할 수 있으며 스레드에 연결되어 있지 않으므로 AutoResetEvent보다 나은 것으로 보입니다.

답변

3

사과와 오렌지를 비교하고 있습니다. RWFSO에는 대기 핸들이 필요합니다. AutoResetEvent와 같습니다. RWFSO가 수행하는 작업은 이 이벤트에 대해 대기를 최적화하는 것입니다. 이를 사용하지 않으면 이벤트의 WaitXxx() 메서드를 호출해야합니다.

대기 WaitingOne()은 이벤트가 Set() 될 때까지 스레드를 차단합니다. 이것은 차단 된 TP 스레드가 다른 예약 된 TP 스레드가 빠르게 실행되지 못하게하기 때문에 스레드 풀 스레드에서 피하기를 원하는 것입니다. 스레드 풀 관리자는 실행중인 TP 스레드의 수를 최적화하여 CPU 코어보다 실행중인 TP 스레드가 더 이상 없도록 시도합니다. 블로킹 (blocking) 쓰레드는 스크루를 뽑아 내고, 매니저는 왜 쓰레드가 블로킹되는지를 알기에는 충분하지 않습니다. TP 스레드를 차단하는 것이 0.5 초 동안 진행되지 않을 때만 관리자가 다른 대기중인 TP 스레드를 실행하도록 허용합니다.

RWFSO는 아주 훌륭하지만 확실히 적절하지는 않습니다. 그것으로 프로그래밍하는 것은 꽤 어색합니다. 특히 예외를 처리하고 싶을 때 그렇습니다. 당신이 그것을 취소 할 필요가 있으면 불쾌한 암묵적인 경주가 있습니다. 이벤트가 신호를받을 때 실행되는 TP 스레드는 동일한 종류의 TP 스케줄링 지연의 영향을받습니다. 그리고 RegisterWaitForMultipleObjects()도 없으며 스레딩에는 종종 WaitAny()를 사용해야합니다. 직관적으로 : 스레드에게 준비가되었음을 알리는 이벤트 하나와 종료 할 스레드에 알리는 또 다른 이벤트.

관련 문제