Pthread互斥断言错误(Pthread mutex assertion error)

2019-06-25 12:46发布

我现在遇到在一个基于linux的(臂)通信应用不可预测的时间出现以下错误:

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

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

提前致谢。

Answer 1:

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



Answer 2:

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

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

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



Answer 3:

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

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



Answer 4:

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

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

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

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

后发生此问题, Foo而实例就被销毁Bar实例仍在使用回调。 回调正在传递到不再存在,因此一个对象的引用,对垃圾存储器打电话__pthread_mutex_lock。

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



Answer 5:

我有同样的问题

在我的情况下,线程内我是连接Vertica的DB与ODBC加入以下设置来/etc/odbcinst.ini解决我的问题。 不歌厅异常为止。

[ODBC]
Threading = 1

学分: 希内克



Answer 6:

在修复了这个问题/etc/odbcinst.ini文件添加线程= 0



文章来源: Pthread mutex assertion error