Pthread互斥断言错误

时间:2009-07-09 18:36:08

标签: linux pthreads mutex assert glibc

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

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

Google提出了很多关于该错误的引用,但很少有与我的情况相关的信息。我想知道是否有人可以给我一些关于如何解决此错误的想法。有谁知道这个断言的常见原因?

提前致谢。

8 个答案:

答案 0 :(得分:27)

直接坚固4天。我在这个宣布胜利。答案是“愚蠢的用户错误”(见上面的评论)。互斥锁只能由锁定它的线程解锁。谢谢你的支持。

答案 1 :(得分:2)

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

虽然接受的答案中的陈述是合法的,但我认为这不是这个失败的断言的原因。因为错误是在pthread_mutex_lock上报告的(并且不是解锁)。

此外,与往常一样,错误更可能是程序员源代码而不是编译器。

答案 2 :(得分:1)

Googling的快速做法经常将此归咎于编译器错误优化。一个不错的总和是here。可能值得查看汇编输出以查看gcc是否正在生成正确的代码。

或者你正在设法踩踏pthread库使用的内存......这些问题很难找到。

答案 3 :(得分:1)

TLDR:确保您没有锁定已被破坏/尚未初始化的互斥锁。

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

请注意,断言位于__pthread_mutex_lock而不是解锁。对我来说,这表明大多数有此问题的人都没有在锁定它的线程中解锁互斥锁;他们只是锁定了一个已被破坏的互斥锁。

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

Foo实例仍在使用回调时销毁Bar实例后发生此问题。回调传递的是对不再存在的对象的引用,因此在垃圾内存上调用了__pthread_mutex_lock。

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

答案 4 :(得分:0)

我遇到了同样的问题

在我的情况下我在线程中使用odbc连接vertica db 将以下设置添加到/etc/odbcinst.ini解决了我的问题。到目前为止还没有找到例外。

[ODBC]
Threading = 1

信用到:hynek

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我刚刚完成了这一步,并认为这可能对其他人有所帮助。 就我而言,问题发生在一种非常简单的方法中,该方法锁定了互斥锁,检查了共享变量,然后返回。 该方法是对创建工作线程的基类的覆盖。

此实例中的问题是基类正在构造函数中创建线程。然后线程开始执行,并调用该方法的派生类实现。不幸的是,派生类尚未完成构造,并且派生类中的互斥体具有未初始化的数据作为互斥体所有者。这使它看起来好像实际上不是在锁定状态。

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

答案 7 :(得分:0)

如果您使用的是 C++ 和 std::unique_lock,请查看此答案:https://stackoverflow.com/a/9240466/9057530