我知道有时候,处于条件变量等待中的线程可能会被Windows唤醒,而Windows会无缘无故地给它们发送一个通知。因此,我们用一个函数来重载wait函数,该函数验证线程是否必须被唤醒。
假设有这样的pseudo:
if (A == false)
conditionVariable.wait (lock, []() { return (A == true) });
cout << "Exit from wait " << endl;
假设在等待之前,另一个线程将A = true,并且它执行conditionVariable.notifyAll()(但我无法侦听它,因为我还没有在等待)。在那之后,我进入等待,没有人可以把锁在其他部分的代码。我的程序的行为是执行计数!我想知道动机是:
A)即使没有人通知线程,它也会退出等待,因为锁是空闲的,并且条件A==true为真。
B)同步是错误的,从理论上讲,你的程序应该永远等待,但是一个"Windows通知"即使你错过了通知也能拯救你。
谢谢你的帮助。
注意,引用中提到wait-with-predicate等价于:
while (!pred()) {
wait(lock);
}
你的if
是不必要的。至于你的问题:由于你自己列出的原因,行为仍然是B)(破碎)。注意,即使引用在通知等待线程之前也有这个代码片段:
// send data to the worker thread
{
std::lock_guard<std::mutex> lk(m);
ready = true;
std::cout << "main() signals data ready for processingn";
}
cv.notify_one();
在设置ready
之前先获取锁可以确保worker看到预期的序列。