【问题标题】:Is waiting for an event subject to spurious wakeups?等待事件是否会受到虚假唤醒?
【发布时间】:2016-08-04 02:10:52
【问题描述】:

SleepConditionVariableCS 的 MSDN 页面声明

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

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

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

如果我要使用 events 而不是条件变量,我可以在等待 (WaitForSingleObject) 发出事件信号时取消 while 循环吗?

【问题讨论】:

    标签: windows multithreading winapi


    【解决方案1】:

    对于WaitForSingleObject(),没有虚假唤醒,因此您可以消除循环。

    如果您将WaitForMultipleObjectsEx()bAlertable=TRUE 一起使用,MsgWaitForMultipleObjects() 与唤醒掩码一起使用,或MsgWaitForMultipleObjectsEx()bAlertable=TRUE 或唤醒掩码一起使用,则在实际发出事件信号之前,等待可以在其他条件下结束。

    【讨论】:

    • 谢谢。知道为什么条件变量容易受到虚假唤醒而事件没有这个问题吗?
    • @work.bin:这只是条件变量的一般工作方式。它也不限于微软的实现。 pthreads suffers from itso does STLboost, too。至于WHY,条件变量是user-mode 对象,而事件是kernel 对象。内核没有虚假唤醒,但用户模式可以,具体取决于线程调度等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多