如您所知,应循环调用条件变量以避免虚假唤醒。像这样:
while (not condition)
condvar.wait();
如果另一个线程想要唤醒等待线程,它必须将条件标志设置为真。例如:
condition = true;
condvar.notify_one();
我想知道,这种情况是否有可能阻止条件变量:
1)等待线程检查条件标志,发现它等于FALSE,所以,它要进入condvar.wait()
例程。
2)但就在此之前(但在条件标志检查之后)等待线程被内核抢占(例如,由于时隙到期)。
3)此时,另一个线程想要通知等待线程条件。它将条件标志设置为 TRUE 并调用condvar.notify_one();
4)当内核调度器再次运行第一个线程时,它进入condvar.wait()
例程,但已经错过了通知。
因此,尽管条件标志设置为 TRUE,但等待线程无法退出condvar.wait()
,因为不再有唤醒通知。
是否可以?