在基于linux的(arm)通信应用程序中,我在不可预测的时间遇到以下错误:
pthread_mutex_lock.c:82: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
Google提出了很多关于该错误的引用,但很少有与我的情况相关的信息。我想知道是否有人可以给我一些关于如何解决此错误的想法。有谁知道这个断言的常见原因?
提前致谢。
答案 0 :(得分:27)
直接坚固4天。我在这个宣布胜利。答案是“愚蠢的用户错误”(见上面的评论)。互斥锁只能由锁定它的线程解锁。谢谢你的支持。
答案 1 :(得分:2)
我遇到了同样的问题,谷歌把我送到了这里。我的程序的问题是在某些情况下我没有在锁定它之前初始化互斥锁。
虽然接受的答案中的陈述是合法的,但我认为这不是这个失败的断言的原因。因为错误是在pthread_mutex_lock
上报告的(并且不是解锁)。
此外,与往常一样,错误更可能是程序员源代码而不是编译器。
答案 2 :(得分:1)
Googling的快速做法经常将此归咎于编译器错误优化。一个不错的总和是here。可能值得查看汇编输出以查看gcc是否正在生成正确的代码。
或者你正在设法踩踏pthread库使用的内存......这些问题很难找到。
答案 3 :(得分:1)
虽然OP有他的答案,但我想我会分享我的问题以防其他人遇到同样的问题。
请注意,断言位于__pthread_mutex_lock
而不是解锁。对我来说,这表明大多数有此问题的人都没有在锁定它的线程中解锁互斥锁;他们只是锁定了一个已被破坏的互斥锁。
对我来说,我有一个类(让我们称之为Foo
),它与其他类(我们称之为Bar
)注册了一个静态回调函数。回调被传递给Foo
的引用,偶尔会锁定/解锁作为Foo
成员的互斥锁。
在Foo
实例仍在使用回调时销毁Bar
实例后发生此问题。回调传递的是对不再存在的对象的引用,因此在垃圾内存上调用了__pthread_mutex_lock。
注意,我使用的是C ++ 11的std::mutex
和std::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