使用 boost::mutex - 隐式删除错误(因为默认定义格式不正确)
Posted
技术标签:
【中文标题】使用 boost::mutex - 隐式删除错误(因为默认定义格式不正确)【英文标题】:Using boost::mutex - implicitly deleted error (because the default definition would be ill-formed) 【发布时间】:2014-04-28 19:24:02 【问题描述】:.h
文件(标题)中的类如下所示
#include <boost/thread.hpp>
class MyClass
private:
boost::mutex bPoolMtx_;
// ... other vars
public:
// public vars and methods
我在尝试构建/编译时遇到以下错误。
MyClass.h:38:7: note: ‘MyClass::MyClass(const MyClass&)’ is implicitly deleted because the default definition would be ill-formed:
MyClass.h:38:7: error: use of deleted function ‘boost::mutex::mutex(const boost::mutex&)’
我还没有在 cpp 文件中使用互斥锁。当我注释掉 boost::mutex
行时,它构建得很好。怎么回事?
【问题讨论】:
表示互斥量不可复制。您可能正在某处复制MyClass
实例。这要求数据成员是可复制的。
没错。尝试禁用 MyClass
的复制,然后看看会发生什么。
【参考方案1】:
编译器生成的默认复制构造函数默认复制所有数据成员。您使用 boost::mutex
会引发错误,因为互斥锁不可复制。
您可以编写自己的复制构造函数,该构造函数不会尝试复制互斥体,或者只是删除MyClass
的复制构造函数。
#include <boost/thread.hpp>
class MyClass
private:
boost::mutex bPoolMtx_;
// ... other vars
public:
// public vars and methods
MyClass(const MyClass&) = delete;
【讨论】:
这是否意味着如果我想使用互斥锁就不能复制 MyClass?例如在某处有一个vector以上是关于使用 boost::mutex - 隐式删除错误(因为默认定义格式不正确)的主要内容,如果未能解决你的问题,请参考以下文章
/include/boost/thread/pthread/mutex.hpp:111: boost::mutex::~mutex(): Assertion `!res' 失败
为啥 boost::mutex 使用原子操作和事件而不是关键部分
两个线程都在调用 boost::mutex::lock() 时阻塞
CUDA主机代码的互斥锁? boost::mutex 由于使用 nvcc 重新定义了 BOOST_COMPILER 没有解决方案