c++ Windows在等待中强制唤醒线程



我知道有时候,处于条件变量等待中的线程可能会被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看到预期的序列。

最新更新