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

wor*_*bin 4 windows winapi multithreading

SleepConditionVariableCS的MSDN页面指出了这一点

条件变量受到虚假唤醒(那些与显式唤醒无关)和被盗唤醒(另一个线程设法在唤醒线程之前运行).因此,您应该在睡眠操作返回后重新检查谓词(通常在while循环中).

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

while (check_predicate())
{
    SleepConditionVariableCS(...)
}
Run Code Online (Sandbox Code Playgroud)

如果我使用事件而不是条件变量,我可以在等待时使用while循环(WaitForSingleObject)来发信号通知事件吗?

Rem*_*eau 7

因为WaitForSingleObject(),没有虚假的唤醒,所以你可以消除循环.

如果使用WaitForMultipleObjectsEx()bAlertable=TRUE,MsgWaitForMultipleObjects()具备唤醒面膜,或MsgWaitForMultipleObjectsEx()bAlertable=TRUE或唤醒面膜,然后等待可以在其他条件结束前的事件实际上是发出信号.