繁体   English   中英

在调用 condition_variable::notify() 之前是否需要锁定互斥锁?

[英]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_onenotify_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM