使用成员std :: mutex(或其他不可复制的对象)复制或移动构造函数?

时间:2016-05-11 19:50:35

标签: class mutex copy-constructor member move-constructor

class A
{
private:
    class B
    {
    private:
        std::mutex mu;
        A* parent = NULL;
    public:
        B(A* const parent_ptr): parent(parent_ptr) {}
        B(const A::B & b_copy) { /* I thought I needed code here */  }
    };
public:
    B b = B(this); //...to make this copy instruction work. 
                   // (Copy constructor is deleted, need to declare a new one?)
};

我有一个类B,基本上是一个线程安全的任务队列。它包含dequemutexcondition_variable。它促进了由类A启动的任意两个线程之间的消费者/生产者关系。我尽可能地简化了代码。

问题始于mutex作为成员:这会删除默认的复制构造函数。这只是意味着我可以使用B(this)构建,但我无法使用B b = B(this)构建副本,这是我在最后一行中需要做的才能给出班级A的班级B成员。解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

简单的解决方案是在您的类中使用std::unique_ptr<std::mutex>,并使用std::make_unique(...)对其进行初始化,其中...是您的std::mutex构造函数参数(如果有)。

这将允许移动但不允许复制。要使其可复制,您需要在复制构造函数中初始化副本,假设副本应具有自己的锁。

如果副本应该共享该锁,那么您应该使用std::shared_ptr。这是可复制的和可移动的。

答案 1 :(得分:1)

感谢Doug提出的使用std :: unique_ptr的建议,我的课程现在很简单,并且做了我想要的。这是我的最终解决方案。

class A
{
private:
    class B
    {
    private:
        std::unique_ptr<std::mutex> mu_ptr = std::make_unique<std::mutex>()
        A* parent = NULL;
    public:
        B(A* const parent_ptr) : parent(parent_ptr) {}
    };
public:
    B b = B(this); // This now works! Great.
};