我想知道如何在另一个类的不同实例中共享一个类中的互斥锁。
现在,我有一个类,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,但我读到这可能会导致意外行为。
有人可以告诉我正确/正确的方法吗?
谢谢!
答案 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文件中定义它。
答案 2 :(得分:0)
正如另一个选项一样,您可以使用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());