首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ 11:不能复制互斥条件变量

C++ 11:不能复制互斥条件变量
EN

Stack Overflow用户
提问于 2019-05-19 02:10:55
回答 3查看 1.3K关注 0票数 2

我是C++ 11和使用线程的新手。我遇到了一个不可能复制互斥和条件变量对象的场景。密码是这样的..。

代码语言:javascript
复制
class producer {

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

    private:
         mutex mut;
         condition_variable cvar;
}

当试图复制构造函数中的变量时,它会给出错误。似乎复制构造函数设置为删除互斥和cv。

有办法克服这一点吗?我想要一个生产者和消费者类,然后从函数中传递mutex & cv。

所以基本上主要功能的调用应该看起来像..。

代码语言:javascript
复制
int main ()
{
    mutex m;
    condition_variable cv;
    //Initialize mutex & cv
    producer prod(m, cv);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-19 02:18:45

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

如果您考虑实现,您是否正在更改某种内核对象?会不会是一样的。可能不会。这是故意的。

票数 2
EN

Stack Overflow用户

发布于 2019-05-19 02:24:18

您需要存储指向mutexcondition_variable的引用或指针。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-05-19 03:30:11

这是不可能的。

复制互斥是什么意思?它应该做些什么?

假设你在等待一个互斥体A,有些人将互斥体A复制到互斥体B。你还在等待A还是B?还是两个人的?不是的。您仍然应该等待A,因此其他互斥B不能是A的副本,因此复制将被删除。

移动操作是有意义的,但是由于互斥变量是静态分配的,如果不改变它们的地址,移动它们是不可能的--这对等待互斥的人来说是一场噩梦。因此,移动操作也被删除。

同样的条件也适用于条件变量。

要克服这些问题,可以使用指向互斥变量和条件变量的指针。比方说,如果您想要一个简单的设计,可以将它们存储为std::shared_ptr<std::mutex>std::shared_ptr<std::condition_variable>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56204230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档