使用 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 您需要编写自己的复制构造函数来复制数据但构造一个新的互斥体。 我明白了。感谢您的回复,我现在通过存储指针来修复它,因为不需要复制。谢谢 “感谢您的回复,我现在通过存储指针来修复它,因为不需要复制。” - 8-| ...危险潜伏。 使用指针意味着副本和原件将锁定同一个互斥锁(即,当原件上的方法调用获取互斥锁时,副本上的所有内部同步方法调用也将阻塞) .这可能不是一个好主意。

以上是关于使用 boost::mutex - 隐式删除错误(因为默认定义格式不正确)的主要内容,如果未能解决你的问题,请参考以下文章

boost::mutex::scoped_lock

/include/boost/thread/pthread/mutex.hpp:111: boost::mutex::~mutex(): Assertion `!res' 失败

为啥 boost::mutex 使用原子操作和事件而不是关键部分

boost mutex 应用

两个线程都在调用 boost::mutex::lock() 时阻塞

CUDA主机代码的互斥锁? boost::mutex 由于使用 nvcc 重新定义了 BOOST_COMPILER 没有解决方案