【发布时间】:2025-12-02 01:40:02
【问题描述】:
我需要同步std::condition_variable/condition_variable_any::notify_one吗?
据我所知,如果丢失通知是可以接受的 - 可以调用 notify_one 不受保护(例如通过互斥锁)。
例如,我看到了以下使用模式(抱歉,不记得在哪里):
{
{
lock_guard<mutex> l(m);
// do work
}
c.notify_one();
}
但是,我检查了 libstdc++ 源代码,发现:
condition_variable::notify_one
void condition_variable::notify_one() noexcept
{
int __e = __gthread_cond_signal(&_M_cond);
// XXX not in spec
// EINVAL
if (__e)
__throw_system_error(__e);
}
和condition_variable_any::notify_one:
void condition_variable_any::notify_one() noexcept
{
lock_guard<mutex> __lock(_M_mutex);
_M_cond.notify_one();
}
这里是 condition_variable_any 的布局:
class condition_variable_any
{
condition_variable _M_cond;
mutex _M_mutex;
// data end
即它只是 condition_variable+mutex 的薄包装。
所以,问题:
- 对于
condition_variable_any或condition_variable,不通过互斥锁保护notify_one是否是线程安全的? - 为什么 condition_variable_any 的实现使用额外的互斥锁?
- 为什么
condition_variable_any::notify_one和condition_variable::notify_one的实现不同?也许condition_variable::notify_one需要手动保护但condition_variable_any::notify_one不需要?是 libstdc++ 错误吗?
【问题讨论】:
标签: c++ multithreading c++11 thread-safety condition-variable