boost::mutex::~mutex(): 断言 '!pthread_mutex_destroy(&m)' 失败
boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed
我在互斥析构函数中得到了标题错误。由于错误可能是由于互斥锁在销毁期间处于锁定状态,我创建了一个新的互斥锁类,它继承自boost:mutex。这是为了确保互斥锁在销毁过程中被解锁。但是,仍然会发生相同的错误。任何点击将被感激!
class CMutes : public boost::mutex
{
public:
CMutes()
{
};
virtual ~CMutes()
{
if (m_bLock)
boost::mutex::unlock();
};
void lock()
{
if(!m_bLock)
boost::mutex::lock();
else
cout << "Mutex is in lock staten";
};
void unlock()
{
if (m_bLock)
boost::mutex::unlock();
else
cout << "Mutex is in unlock staten";
}
boost::mutex& getMutex()
{
return *this;
}
private:
bool m_bLock;
};
编辑:是的,你是对的。我应该使用RAII。然而,我有一个情况。我需要在另一个线程完成处理之前锁定资源。如下所示
Thread A:
void getDate()
{
m_oLock.lock();
// access resource
}
void unlock()
{
m_oLock.unlock();
}
Thread B:
void Process()
{
threadA.getData();
threadA.unlock();
}
不要继承boost::mutex
, boost::mutex
类没有虚析构函数,所以它实际上不是用于继承的。
可能的根本原因:
你得到的错误表明你在一个从未被锁定的互斥体上调用unlock
。例如:
boost::mutex m;
m.unlock();
通过尝试做lock
和unlock
,似乎您失去了互斥是否被锁定的跟踪。这是手动执行资源管理时经常出现的问题。c++允许一种特殊的机制叫做资源分配是初始化(RAII),用于安全防范此类问题。
建议解决方案:
您应该使用RAII,而不是显式地解锁互斥锁。您可以使用boost::mutex::scoped_lock来实现RAII:
struct YourStruct
{
void doSomething()
{
boost::mutex::scoped_lock l(m_mutex);
//do something Interesting
}
private:
boost::mutex m_mutex;
};
我有同样的错误(这就是我如何发现这个问题)。我通过向相关线程添加join
来解决问题。我的主进程在线程完成之前就完成了,mutex
在被解锁之前就被拆除了。
POSIX声明pthread_mutex_destroy
操作返回的唯一错误是:如果互斥锁无效,则返回EINVAL
;如果有人正在使用它(显式地或通过条件变量),则返回EBUSY
。
最可能的情况是第二种。
然而,我在任何代码中都没有看到m_bLock
成员变量的任何更改。您确定不想在lock
和unlock
调用中更改此变量吗?
如果正在使用中,您只需等待,直到使用它的人愿意发布它。任何其他选择都不太可能对你有好处:-)
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- std::mutex 如何防止线程修改?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- std::atomic 和 std::mutex 的相对性能
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- 当"std::lock_guard<std::mutex>"对象没有名称时的不同行为
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- 使用 std::mutex 保护环路
- std::mutex作为一个成员变量对多个线程来说是安全的吗
- 将赋值运算符实现为"destroy + construct"是否合法?
- std::shared_timed_mutex何时比std::mutex慢,以及何时(不)使用它
- <mutex> 使用 /clr 或 /clr:pure 编译时不支持
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 返回持有 std::mutex 锁的 RAII 容器类
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- 为什么 C++17 个 destroy()/destroy_n() 函数向前(而不是向后)运行?
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象