我在一个基于Linux(ARM)的通信应用程序中时不时地遇到以下错误:
pthread_mutex_lock.c:82: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
在谷歌上搜索这个错误会出现很多参考资料,但似乎没有什么与我情况相关的信息。我想知道是否有人可以给我一些解决这个错误的思路。有人知道这种断言错误的常见原因吗?
提前致谢。
我在一个基于Linux(ARM)的通信应用程序中时不时地遇到以下错误:
pthread_mutex_lock.c:82: __pthread_mutex_lock: Assertion `mutex->__data.__owner == 0' failed.
在谷歌上搜索这个错误会出现很多参考资料,但似乎没有什么与我情况相关的信息。我想知道是否有人可以给我一些解决这个错误的思路。有人知道这种断言错误的常见原因吗?
提前致谢。
四天内稳如磐石。我宣布取得了胜利。答案是“愚蠢的用户错误”(请参见上面的评论)。互斥锁只应由锁定它的线程解锁。感谢您一直以来的支持。
虽然问题已经解决,但我想分享我的问题以防其他人遇到和我类似的问题。
请注意,断言出现在__pthread_mutex_lock
而不是解锁中。对我来说,这意味着大多数遇到此问题的其他人并不是在不同的线程中解锁了互斥量,而是锁定了一个已经被销毁的互斥量。
对于我而言,我有一个类(我们称之为Foo
),它在某个其他类(我们称之为Bar
)中注册了一个静态回调函数。该回调会传递一个对Foo
的引用,并且会偶尔锁定/解锁Foo
的成员互斥量。
在Foo
实例被销毁后,Bar
实例仍在使用该回调函数时出现了此问题。该回调函数将引用传递给一个不存在的对象,因此在垃圾内存上调用 __pthread_mutex_lock。
请注意,我使用的是C++11的std::mutex
和std::lock_guard<std::mutex>
,但由于我在Linux上,所以问题完全相同。
pthread_mutex_lock
(而不是解锁)上。如果您正在使用C++和std::unique_lock
,请查看此答案: https://dev59.com/oGDVa4cB1Zd3GeqPcFCJ#9240466
[ODBC]
Threading = 1
我做了一些简单的谷歌搜索,发现这个问题通常是由编译器错误优化引起的。这里有一个很好的总结。你可以查看汇编输出以确定gcc是否产生了正确的代码。
或者你可能会意外地覆盖了pthread库使用的内存......这类问题不太容易发现。
assert (mutex->__data.__owner == 0);
154: e5953008 ldr r3, [r5, #8]
158: e3530000 cmp r3, #0 ; 0x0
15c: 1a0001a0 bne 7e4 <__pthread_mutex_lock+0x7e4> - Dave Causey