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

标签 c++ windows multithreading visual-studio condition-variable

我知道有时,条件变量等待中的线程可以从 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/

相关文章:

c# - 保持定时器类型的线程

android - Android 中 JPA 的 Realm 或论文?

C++ 条件等待竞争条件

c++ - 我可以将指针传递给指针,分配内存,然后将其传回吗?

node.js - NPM:运行 npm 时未找到 npm-cli.js

python - Request.get 突然开始遇到 "Temporary failure in name resolution"错误

windows - 对名为 guid 的目录进行排序

c++ - Bitblt,createdibsection,图像损坏

c++ - 为什么复制构造函数参数是 const?

c++ - 我在这里违反了 OOP 设计指南吗?几个有趣的设计泡菜