我遇到在不可预测的时间以下错误在基于Linux的(臂)通信应用程序:

pthread_mutex_lock.c:82: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.

谷歌变成了很多的错误引用,但信息很少,这似乎与我的情况。我想知道如果任何人都可以给我关于如何解决此错误的一些想法。有谁知道这个论断一个共同的事业的?

预先感谢。

有帮助吗?

解决方案

4天摇滚固体直。我就这一个宣告胜利。答案是“愚蠢的用户错误”(见上述评论)。互斥应仅由锁定它的线程解锁。感谢您与我的轴承。

其他提示

我面临着同样的问题,谷歌派我到这里。我的程序的问题是,在某些情况下,我没有锁定前初始化互斥。

虽然在接受答案的声明是合法的,我想是不是这个原因失败的断言。因为错误被报告pthread_mutex_lock(和解锁)。

此外,如往常,这是更可能的是错误在程序员源代码,而不是编译器。

TLDR:确保你不锁定已销毁的互斥/尚未初始化

虽然OP有他的回答,我想我会分享我的问题的情况下,其他人有同样的问题,我做到了。

注意断言是在__pthread_mutex_lock而不是在解锁。这对我来说,意味着有这个问题大多数其他人都没有解锁在不同的线程比锁定它的一个互斥;它们只是锁定已销毁互斥。

对于我来说,我有一个类(我们称之为Foo),其注册的静态回调函数与其他一些类(我们称之为Bar)。回调被传递一个参考Foo和偶尔会锁定/解锁互斥这是Foo的成员。

Foo实例仍在使用回调Bar实例被破坏之后发生此问题。回调正在传递到不再存在,因此一个对象的引用,于垃圾存储器调用__pthread_mutex_lock。

请注意,我用C ++ 11的std::mutexstd::lock_guard<std::mutex>,但是,由于我是在Linux,问题是完全一样的。

谷歌搜索我做的快一点常常指责这对一个编译器错误优化。一个体面的总和这里。这可能是值得考虑的汇编输出,看看GCC是生产正确的代码。

如果不是这样,你是管理来践踏由并行线程库使用的记忆......那些之类的问题都比较难找到。

我有同样的问题

在我的情况线程我被连接Vertica的分贝使用ODBC内部 添加下面的设置来/etc/odbcinst.ini解决我的问题。不歌厅异常为止。

[ODBC]
Threading = 1

学分:希内克

在固定此问题/etc/odbcinst.ini文件添加线程= 0

我刚才打我的方式,通过这一个,并认为这可能帮助别人。 在我的情况的问题,在锁定互斥一个非常简单的方法发生,检查共享变量,然后返回。 该方法是它创建了一个工作线程的基类覆盖。

在这种情况下的问题是,所述基类是创造在构造该线程。该线程将开始执行和派生类的实现方法被调用。不幸的是,派生类尚未完成建设,并在派生类中的互斥体有未初始化的数据作为互斥所有者。这使得它看起来像它实际上是被锁定时,它不是。

的解决方案是非常简单的。受保护的方法添加到称为StartThread基类()。这需要在派生类的构造函数被调用,而不是从基类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top