我正在阅读一些示例代码condition_variable:
在 cppreference 中,notify_one()这样调用:
https://en.cppreference.com/w/cpp/thread/condition_variable
{
std::lock_guard lk(m);
ready = true;
std::cout << "main() signals data ready for processing\n";
}
cv.notify_one();
Run Code Online (Sandbox Code Playgroud)
从上面的代码可以清楚地看出,没有必要使用anymutex来调用notify_one().
但在cplusplus.com,代码是这样的: https ://cplusplus.com/reference/condition_variable/condition_variable/
std::unique_lock<std::mutex> lck(mtx);
ready = true;
cv.notify_all();
Run Code Online (Sandbox Code Playgroud)
看来应该mutex在调用之前使用a notify_all()。
我很困惑,这是功能mutex所必需的吗notify_*()?
调用或持有互斥锁并不强制。notify_onenotify_all
从std::condition_variable 文档中:
打算修改共享变量的线程必须做的第三件事是:
对std::condition_variable执行notify_one或notify_all(通知不需要持有锁)
(重点是我的)。
然而,在锁下调用可能会带来一些性能优势。notify_*
从评论到我的回答(归功于@DavidSchwartz):
通过在调用互斥体之前解锁它,您会无缘无故地使notify_all变得更加昂贵。如果您在持有互斥体的同时调用notify_all,大多数现代实现都知道它无法使任何线程准备好运行(因为它们需要获取互斥体才能向前推进)并且可以进行等待变形优化。按照这种编码方式,notify_all 和 lck 的析构函数都可以使线程准备好运行,从而导致性能下降。
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |