如何在类的不同实例之间共享互斥锁?

时间:2012-09-03 02:56:22

标签: c++ boost synchronization condition-variable boost-mutex

我想知道如何在另一个类的不同实例中共享一个类中的互斥锁。

现在,我有一个类,Indexer,它有一个Boost互斥锁和condition_variable作为私有成员变量。我在main中创建了一个Indexer类的auto_ptr,并将Indexer的指针传递给另一个类Robot的实例。

我这样做如下:

std::auto_ptr<Indexer> index_service(new Indexer());
Robot a(*index_service.get());
Robot b(*index_service.get());
Robot c(*index_service.get());

Robot的构造函数是:

Robot(Indexer &index_service)
{
  this->index_service = index_service;
}

Robot的标题如下:

class Robot
{
   public:
     Robot(Indexer &index_service);
   private:
     Indexer index_service;
};

但是,由于互斥锁是不可复制的,我收到错误。

我正在考虑制作互斥锁和condition_variable shared_ptrs,但我读到这可能会导致意外行为。

有人可以告诉我正确/正确的方法吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

我不是C ++专家,但看起来像传递引用和指针的混合组合在这里很麻烦。

具体而言,您这样做:this->index_service = index_service;
但是值传递为Indexer &index_service
因为本地index_service是类型Indexer index_service;
我认为这项任务意味着复制。

我假设你只想要Indexer的一个实例,所以你真的有意在Robot类中存储对它的引用。要做到这一点,你可能希望让你的构造函数接受一个指针(这就是*index_service.get()调用正在给你的东西)。此外,您希望您的类变量是指针类型。

答案 1 :(得分:0)

在你的类中声明一个静态boost :: mutex。请记住在.cpp文件中定义它。

点击此处: Using static mutex in a class

答案 2 :(得分:0)

正如另一个选项一样,您可以使用std::shared_ptr代替std::auto_ptrRobot班级更改Indexer to std :: shared_ptr`。

class Robot
{
public:
    Robot( std::shared_ptr<Indexer> const &index_service)
    {
        this->index_service = index_service;
}
private:
   std::shared_ptr<Indexer> index_service;
};

std::shared_ptr<Indexer> index_service(new Indexer());
Robot a(*index_service.get());
Robot b(*index_service.get());
Robot c(*index_service.get());