SleepConditionVariableCS的MSDN页面声明
条件variables会受到虚假的唤醒(与明确唤醒不相关的唤醒)和被盗唤醒(另一个线程在唤醒线程之前运行)的影响。 因此,在睡眠操作返回之后,应该重新检查谓词(通常在while循环中)。
结果,有条件的等待必须被包含在一个while循环中
while (check_predicate()) { SleepConditionVariableCS(...) }
如果我要使用事件而不是条件variables,可以在等待( WaitForSingleObject )等待事件发送信号的时候使用while循环吗?
对于WaitForSingleObject()
,没有虚假的唤醒,所以你可以消除循环。
如果在bAlertable=TRUE
,带有唤醒掩码的MsgWaitForMultipleObjectsEx()
或带有bAlertable=TRUE
MsgWaitForMultipleObjectsEx()
或唤醒掩码中使用WaitForMultipleObjectsEx()
,则可以在实际发送事件之前等待其他条件。