相关疑难解决方法(0)

为什么pthreads的条件变量函数需要互斥锁?

我正在读书pthread.h; 条件变量相关函数(如pthread_cond_wait(3))需要互斥量作为参数.为什么?据我所知,我将创建一个互斥体只是用作该参数?那个互斥锁应该做什么?

c mutex pthreads condition-variable

177
推荐指数
6
解决办法
7万
查看次数

我是否需要同步std :: condition_variable/condition_variable_any :: notify_one

我需要同步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周围的薄包装.

所以,问题:

  1. 它是线程安全的,不保护notify_one的互斥体的任一condition_variable_anycondition_variable
  2. 为什么condition_variable_any的实现使用额外的互斥锁?
  3. 为什么实施 …

c++ multithreading condition-variable thread-safety c++11

15
推荐指数
1
解决办法
2265
查看次数