对这个问题的回答是错误的,因为它有机会发生死锁。 Condition Variable - Wait/Notify Race Condition如何解决条件变量wait/notify的竞态条件
我没有找到解决竞态条件或死锁问题的解决方案。
想象一下,我们有两个线程。现在的目标如下。
first condition:
Thread 1 Waits
Thread 2 Notifies
second condition:
Thread 2 Notifies
Thread 1 Should not wait and continue normal execution.
如何在不通知队列的情况下正确实现这个功能?因为我希望这部分代码尽可能快地运行,并使用布尔值而不是将项目添加到队列中。也只有2个线程,所以使用队列似乎对我来说过分了。
在有竞争条件的伪代码:
Thread 1:
lock(x);
if(!signaled)
{
unlock(x); // ********
// still small gap, how to avoid?
cv.wait(); // forget spurious wakeup for sake of simplicity
signaled = false;
}
else // ********
unlock(x);
Thread 2:
lock(x);
signaled = true;
cv.notify();
unlock(x);
现在,如果你删除与********
竞争条件注释两条线都将迎刃而解和僵局的机会将被引入其中线程1等待,而拥有的锁,线程2卡在锁定x。
您可能想使用['std :: atomic'](http://en.cppreference.com/w/cpp/atomic/atomic)机制来处理这个案例。 – tadman
你的假设是不正确的。 'conditional_variable :: wait' **原子**进入等待模式并释放锁。 – SergeyA
即使'conditional_variable :: wait'释放了锁,我很确定它在**等待之前就这么做了,所以差距仍然存在于内部@SergeyA –