如何在类的不同实例之间共享互斥对象



我想知道如何在一个类的不同实例之间共享一个类中的互斥对象。

现在,我有一个类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(Indexer &index_service)
{
  this->index_service = index_service;
}

机器人的头部看起来像:

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

但是,由于互斥是不可压缩的,所以我得到了一个错误。

我想让互斥和condition_variable共享ptrs,但我读到这可能会导致意外行为。

有人能告诉我做这件事的正确方法吗?

谢谢!

我不是C++大师,但引用传递和指针的混合似乎很麻烦。

具体来说:this->index_service = index_service;
但该值作为Indexer &index_service
传入由于本地index_service类型为Indexer index_service;
我认为这项任务意味着抄袭。

我假设您只想要Indexer的一个实例,所以您实际上是想在Robot类中存储对它的引用。要做到这一点,您需要让您的构造函数获取一个指针(无论如何,*index_service.get()调用都会得到这个指针)。此外,您还希望类变量是指针类型。

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

点击此处:在类中使用静态互斥

正如另一个选项一样,您可以使用std::shared_ptr代替std::auto_ptr,并在Robot类中更改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());

最新更新