我正在读书pthread.h; 条件变量相关函数(如pthread_cond_wait(3))需要互斥量作为参数.为什么?据我所知,我将创建一个互斥体只是用作该参数?那个互斥锁应该做什么?
我需要同步std::condition_variable/condition_variable_any::notify_one吗?
据我所知,如果通知丢失是可以接受的 - 可以调用notify_one不受保护(例如通过互斥).
例如,我看到了以下使用模式(抱歉,不记得在哪里):
{
{
lock_guard<mutex> l(m);
// do work
}
c.notify_one();
}
Run Code Online (Sandbox Code Playgroud)
但是,我检查了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);
}
Run Code Online (Sandbox Code Playgroud)
和condition_variable_any :: notify_one:
void condition_variable_any::notify_one() noexcept
{
lock_guard<mutex> __lock(_M_mutex);
_M_cond.notify_one();
}
Run Code Online (Sandbox Code Playgroud)
这里是condition_variable_any的布局:
class condition_variable_any
{
condition_variable _M_cond;
mutex _M_mutex;
// data end
Run Code Online (Sandbox Code Playgroud)
即它只是condition_variable + mutex周围的薄包装.
所以,问题:
notify_one的互斥体的任一condition_variable_any或condition_variable?