【发布时间】:2013-02-10 22:07:31
【问题描述】:
如您所知,应循环调用条件变量以避免虚假唤醒。像这样:
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() 退出,因为不再有唤醒通知。
有可能吗?
【问题讨论】:
-
@bamboon。是的,这些问题非常相似。我刚刚从另一个方面解决了这个问题。
标签: c++ c++11 condition-variable