boost::shared_ptr boost::互斥锁和复制构造函数
boost::shared_ptr boost::mutex and 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中。我不需要对其进行复制,如果向量需要进行复制,我不希望每个副本都有不同的互斥体。这就是为什么我认为复制构造函数对我有效。
这种方法非常有效和合法,但请注意,随着类的发展,您可能希望将相同的技术应用于更多的类成员。这就是为什么我建议你考虑利用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)
{}
如果您复制一个Sample对象,将调用复制构造函数,要么由编译器自动生成,要么由您显式编写。
允许复制Sample对象是否是个好主意取决于您要做什么。如果允许复制没有意义,那么使对象不可复制,例如为复制构造函数提供一个私有原型。
如果您确实希望允许拷贝,那么您需要决定每个拷贝是否应该有自己的互斥对象,并适当地定义拷贝构造函数。自动生成的复制构造函数将只执行浅层复制,因此所有副本都将共享互斥对象。
相关文章:
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 在 boost::variant 中类 holden 的复制构造函数存在问题
- 如何通过 boost::p ython 重命名构造函数的关键字参数
- 无法将参数传递给 boost::thread 构造函数
- 为什么Boost Variant使用模板构造函数而不是Boost::beast::websocket::stream的移
- 如何使用boost::hana::unpack和构造函数,而不是函数
- "非静态数据成员之前需要构造函数" - 我是否使用"boost::variant"
- Boost::msm 如何使用非默认构造函数初始化state_machine_def和 msm::front::sta
- 将动态分配对象传递到 boost::any 构造函数中
- Boost Python - 用参数包装构造函数
- C 从类的构造函数运行Boost线程
- 带有 Boost.Python 的私有构造函数
- Boost.Python - 参数化构造函数的错误
- 如何将构造函数参数转发到 boost::optional
- Boost-Spirit(X3)解析,没有默认构造函数
- 不能在构造函数中使用 boost.asio 解析器
- Boost::序列化 - 如何序列化需要数据分配但没有默认构造函数的数据结构
- 在 boost::lockfree:queue 默认构造函数的情况下断言失败
- 具有多个数组的类的构造函数启动器列表(C++11 是可以的,boost 和 std::vector 不是)
- C++:为什么 boost::p tr_vector 调整大小需要对象具有默认构造函数