正在等待一场受到虚假唤醒的事件?

时间:2016-08-04 02:10:52

标签: windows multithreading winapi

SleepConditionVariableCS的MSDN页面说明了

  

条件变量受到虚假唤醒(那些不是   与明确的唤醒相关联和被盗的唤醒(另一个线程   设法在唤醒线程之前运行。因此,你应该重新检查   睡眠操作后的谓词(通常在while循环中)   回报。

因此,条件等待必须包含在while循环中,即

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

如果我使用events代替条件变量,我可以在等待(WaitForSingleObject)时取消while循环以便发出信号吗?

1 个答案:

答案 0 :(得分:7)

对于WaitForSingleObject(),没有虚假的唤醒,所以你可以消除循环。

如果您使用WaitForMultipleObjectsEx() bAlertable=TRUEMsgWaitForMultipleObjects()使用唤醒模板,MsgWaitForMultipleObjectsEx()使用bAlertable=TRUE或使用唤醒模板,那么等待可以结束在事件实际发出信号之前的其他条件。