gpt4 book ai didi

C++ Windows 窗口是否强制唤醒等待中的线程?

转载 作者:行者123 更新时间:2023-11-30 05:39:14 26 4
gpt4 key购买 nike

我知道有时,条件变量等待中的线程可以从 Windows 中唤醒,Windows 会无缘无故地向它们发送通知。所以我们用一个函数重载函数 wait 来验证线程是否必须被唤醒。

假设有这个伪:

if (A == false)
conditionVariable.wait (lock, []() { return (A == true) });
cout << "Exit from wait " << endl;

假设在等待之前,另一个线程将 A = true,并且它执行了一个 conditionVariable.notifyAll() (但我不能听它,因为我还没有等待)。在那之后,我进入等待,没有人可以锁定代码的其他部分。我的程序的行为是 cout 的执行!我想了解动机是否是:

A) 即使没有人通知线程,它也会从等待中退出,因为锁是空闲的并且因为条件 A==true 为真。

B) 同步错误,理论上你的程序应该永远等待,但即使你错过了通知,“Windows 通知”也会拯救你。

感谢您的帮助。

最佳答案

请注意引用文献中提到 wait-with-predicate 等同于:

while (!pred()) {
wait(lock);
}

您的 if 是不必要的。至于你的问题:由于你自己列出的原因,行为仍然是 B) (损坏)。请注意,即使是 reference在通知等待线程之前有这个片段:

// send data to the worker thread
{
std::lock_guard<std::mutex> lk(m);
ready = true;
std::cout << "main() signals data ready for processing\n";
}
cv.notify_one();

在设置 ready 之前先获取锁确保 worker 看到预期的序列。

关于C++ Windows 窗口是否强制唤醒等待中的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32442048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com