我需要同步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 的薄包装。
所以,问题:
notify_one
不使用互斥锁保护condition_variable_any
或是否是线程安全的condition_variable
?- 为什么 condition_variable_any 的实现使用额外的互斥锁?
- 为什么执行
condition_variable_any::notify_one
和condition_variable::notify_one
不同?也许condition_variable::notify_one
需要手动保护,但condition_variable_any::notify_one
不需要?它是 libstdc++ 错误吗?