C ++ 11:无法复制互斥量和条件变量

时间:2019-05-19 02:10:55

标签: c++ c++11

C ++ 11的新手,使用了线程。我遇到了无法复制互斥量和条件变量对象的情况。代码是这样的。。。

class producer {

   public: 
      producer(mutex m, condition_variable cv) 
      {
           mut = m;    // ERROR
           cvar = cv;   // ERROR
       }

    private:
         mutex mut;
         condition_variable cvar;
}

当尝试在构造函数中复制变量时,出现错误。似乎将复制构造函数设置为针对互斥和cv删除。

有办法克服吗?我想要一个生产者和消费者类,然后从 main 函数传递互斥体和简历。

所以基本上从主函数的调用应该看起来像....

int main ()
{
    mutex m;
    condition_variable cv;
    //Initialize mutex & cv
    producer prod(m, cv);
}

3 个答案:

答案 0 :(得分:2)

否,这是不可能的。在C ++中添加了功能以启用此功能(非复制)。

如果考虑实现,您是否正在更改某种内核对象?会一样吗?可能不会。这是设计使然。

答案 1 :(得分:1)

您将要存储对mutexcondition_variable的引用或指针。

class producer {
public: 
  producer(mutex & m, condition_variable & cv) 
    : _mut{m}
    , _cvar{cv}
  {
  }

private:
     mutex & mut;
     condition_variable & cvar;
};

您可以使用std::shared_ptr,因为这样可以使您的实例拥有mutexcondition_variable的强大所有权,但是键入速度更快。

答案 2 :(得分:1)

设计上不可能。

复制互斥量甚至意味着什么?应该怎么办?

假设您等待互斥锁A,并且某些主体将互斥锁A复制到互斥锁B。 您还在等待A还是B?还是对他们俩来说?否。您仍然应该等待A。 因此其他互斥锁B不能是A的副本。因此复制被删除。

移动操作很有意义,但是由于互斥量是静态分配的,因此在不更改其地址的情况下就不可能移动它们-这对于任何等待该互斥量的人来说都是一场噩梦。因此,移动操作也会被删除。

条件变量适用相同的条件。

要克服这些问题,可以使用互斥量和条件变量的指针。假设要进行简单设计,请将它们存储为std::shared_ptr<std::mutex>std::shared_ptr<std::condition_variable>