2016-08-04 101 views
4

的MSDN頁面SleepConditionVariableCS指出是否正在等待發生虛假喚醒的事件?

條件變量受虛假喚醒(那些不 有一個明確的喚醒相關)和被盜喚醒(另一個線程 管理喚醒線程之前運行)。因此,在睡眠操作返回 之後,您應該重新檢查謂詞(通常在while循環中)。

結果條件等待已被封閉在一個while循環,即

while (check_predicate()) 
{ 
    SleepConditionVariableCS(...) 
} 

如果我使用events代替條件變量我可以用while循環做掉在等待(WaitForSingleObject )爲事件發信號?

回答

7

對於WaitForSingleObject(),沒有虛假的喚醒,所以你可以消除循環。

如果使用WaitForMultipleObjectsEx()bAlertable=TRUEMsgWaitForMultipleObjects()具備喚醒面膜,或用MsgWaitForMultipleObjectsEx()bAlertable=TRUE喚醒面膜,然後等待可以在其他條件結束前的事件實際上是發出信號。

+0

謝謝。任何想法爲什麼條件變量容易被虛假喚醒而事件沒有這個問題? –

+1

@ work.bin:它只是條件變量一般工作的方式。它也不僅限於微軟的實施。 [pthreads患有它](http://stackoverflow.com/questions/8594591/),[STL](http://en.cppreference.com/w/cpp/thread/condition_variable)[和boost,太](http://www.boost.org/doc/libs/1_58_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref)。至於* WHY *,條件變量是* user-mode *對象,而事件是* kernel *對象。內核不會產生虛假喚醒,但用戶模式可以根據線程調度等進行調整。 –