[英]unlock the mutex after condition_variable::notify_all() or before?
[英]Do I need to lock the mutex before calling condition_variable::notify()?
我正在阅读一些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();
从上面的代码中,很明显不需要使用任何mutex
来调用notify_one()
。
但是在cplusplus.com,代码是这样的: https://cplusplus.com/reference/condition_variable/condition_variable/
std::unique_lock<std::mutex> lck(mtx);
ready = true;
cv.notify_all();
似乎在调用notify_all()
之前应该使用mutex
。
我很困惑, notify_*()
function 是否需要mutex
?
在持有互斥锁的锁下调用notify_one
或notify_all
不是强制性的。
从std::condition_variable
文档:
打算修改共享变量的线程要做的第三件事是:
在 std::condition_variable 上执行 notify_one 或 notify_all (通知不需要持有锁)
(重点是我的)。
但是- 在锁定下调用notify_*
可能会提供一些性能优势。
从评论到我的回答(归功于@DavidSchwartz):
通过在调用它之前解锁互斥锁,您无缘无故地让 notify_all 变得更加昂贵。 如果您在持有互斥锁的同时调用 notify_all,大多数现代实现都知道它不能使任何线程准备好运行(因为它们需要获取互斥锁才能向前推进)并且可以进行等待变形优化。 这种编码方式,notify_all 和 lck 的析构函数都可以使线程准备好运行,从而导致性能下降。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.