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

Fel*_* Xu 5 c++ mutex

我正在阅读一些示例代码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_*()

woh*_*tad 2

调用或持有互斥锁并不强制。notify_onenotify_all

std::condition_variable 文档中:
打算修改共享变量的线程必须做的第三件事是:

对std::condition_variable执行notify_one或notify_all(通知不需要持有锁)

(重点是我的)

然而,在锁下调用可能会带来一些性能优势。notify_*

评论到我的回答(归功于@DavidSchwartz):

通过在调用互斥体之前解锁它,您会无缘无故地使notify_all变得更加昂贵。如果您在持有互斥体的同时调用notify_all,大多数现代实现都知道它无法使任何线程准备好运行(因为它们需要获取互斥体才能向前推进)并且可以进行等待变形优化。按照这种编码方式,notify_all 和 lck 的析构函数都可以使线程准备好运行,从而导致性能下降。