Pthread互斥断言错误

在基于linux的(arm)通信应用程序中,我在不可预知的时间遇到​​以下错误:

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

谷歌对这个错误提出了很多的参考,但很less的信息似乎与我的情况有关。 我想知道是否有人可以给我一些关于如何解决这个错误的想法。 有没有人知道这个断言的一个共同的原因?

提前致谢。

Solutions Collecting From Web of "Pthread互斥断言错误"

坚如磐石连续4天。 我正在宣布这个胜利。 答案是“愚蠢的用户错误”(见上面的注释)。 互斥体只能由锁定它的线程解锁。 感谢您的支持。

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

尽管接受答案中的陈述是合理的,但我认为这不是造成这一失败的原因。 因为错误是在pthread_mutex_lock (而不是解锁)上报告的。

而且,一如往常,错误更可能出现在程序员源代码而不是编译器中。

我所做的一些Google搜索经常把这归咎于编译器的错误优化。 这里有一个体面的总结。 看看汇编输出可能是值得的,看gcc是否产生正确的代码。

无论是或者你正在设法跺脚pthread图书馆使用的内存…这些问题是相当棘手的发现。

TLDR:确保你没有锁定已经被销毁/尚未初始化的互斥锁。

虽然OP有他的答案,但我想我会分享我的问题,以防其他人有同样的问题,我做了。

注意断言是在__pthread_mutex_lock而不是在解锁中。 对我而言,这表明大多数其他人在解决这个问题时并不是在一个不同的线程中解锁一个互斥锁。 他们只是锁定了已经被破坏的互斥体。

对我来说,我有一个类(我们称之为Foo ),它与其他类(我们称之为Bar )一起注册了一个静态回调函数。 回调被传递给Foo的引用,偶尔会锁定/解锁一个Foo成员的互斥。

Bar实例仍在使用回调时, Foo实例被销毁之后发生此问题。 回调被传递给一个不再存在的对象的引用,因此在垃圾内存中调用__pthread_mutex_lock。

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

我有同样的问题

在我的情况下,我正在连接vertica db与odbc的线程添加以下设置到/etc/odbcinst.ini解决了我的问题。 到目前为止,没有发生异常。

 [ODBC] Threading = 1 

学分: hynek

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