boost :: shared_ptr boost :: mutex和copy构造函数

时间:2012-02-28 14:24:00

标签: c++ boost mutex shared-ptr copy-constructor

我需要保护对班级中数据结构的访问。因为我不能拥有互斥(因为我无法复制它)我正在考虑使用shared_ptr并将互斥锁保留在那里。以下是我的想法的示例代码:

class Sample {
    typedef boost::lock_guard<boost::mutex> AcquireLock;
    boost::shared_ptr<boost::mutex> mutt;

public:
    Sample() : mutt(new boost::mutex) {}

    void Method()
    {
        AcquireLock lock(*mutt);

        //do some work here
    }
};

我有以下问题:

  • 以这种方式使用互斥锁(作为类的成员,通过shared_ptr)是不好的做法?
  • 我是否应该拥有此类的复制构造函数,因为它通过shared_ptr在堆上分配了内存?

编辑:也许我需要提供更多细节: 我将只创建一次该对象并将其保存在std :: vector中。我不需要复制它,如果向量需要复制,我不希望每个副本都有不同的互斥锁。这就是为什么我认为复制构造函数对我有用。

2 个答案:

答案 0 :(得分:2)

这种方法非常有效且合法,但请注意,随着课程的发展,您可能希望将相同的技术应用于更多的类成员。这就是为什么我建议你考虑利用pImpl习语:

// in hpp:
class Sample
{
  Impl();
private:
  struct Impl;
  // compiler generated copy-constructor will copy only this shared_ptr
  shared_ptr<void> pImpl_;
};

// in cpp:
struct Sample::Impl
{
  mutex mut_;
  // put here whatever members you need, extend Impl without affecting the Sample interface
};

Impl::Impl() : pImpl_(new Impl)
{}

答案 1 :(得分:1)

如果您复制Sample对象,将调用复制构造函数,可以是编译器自动生成的,也可以是您明确编写的复制构造函数。

允许Sample对象的副本是否一个好主意取决于您尝试做什么。 如果允许复制没有意义,那么使对象不可复制,例如通过为复制构造函数提供私有原型。

如果您确实想要允许复制,那么您需要确定每个副本是否应该有自己的互斥锁,并适当地定义复制构造。自动生成的复制构造函数只会执行浅拷贝,因此所有副本都将共享互斥锁。