C++ Windows window 是否强制唤醒等待中的线程?
C++ Windows does window force the waking-up of thread in wait?
我知道有时,条件变量等待中的线程可以从 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 notify" 也会拯救你。
感谢您的帮助。
请注意,参考文献中提到 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
之前先获取锁确保工作人员看到预期的序列。
我知道有时,条件变量等待中的线程可以从 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 notify" 也会拯救你。
感谢您的帮助。
请注意,参考文献中提到 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
之前先获取锁确保工作人员看到预期的序列。