pthread_mutex_lock锁定,但未设置所有者

我已经在这个工作了几天 –

作为背景,我正在研究一个单线程C程序并使其成为multithreading。 我最近发现了一个新的死锁情况,但是当我看到gdb中的互斥锁时,我看到了

__lock = 2但是__owner = 0

这不是递归的互斥锁。 有没有人见过这个? 我正在处理的程序是一个守护程序,这种情况只发生在以高吞吐率执行超过20分钟(大约)然后放松负载之后。 如果您有任何想法,我将不胜感激。

编辑 – 我忽略了提到我的所有其他线程此时都处于空闲状态。

干杯

这是可以预料的。 普通(非递归,非错误检查)互斥锁无需存储其所有者,并且可以保存一些时间来跳过查找调用者的线程ID的步骤。 (这在x86上几乎没有什么区别,但在像MIPS这样的平台上可能会有很大的不同,因为没有线程寄存器,并且线程ID会导致内核空间出现故障。

您遇到的死锁几乎肯定是由于线程试图锁定它已经存在的互斥锁,或者是一个实际的逻辑错误,其中两个或多个线程都在等待另一个互斥的互斥锁。

据我所知,这是由于pthread库的限制。 每当我发现部分代码使用过多的锁定和解锁并严重强调代码部分时,我就遇到过这种情况。 我通过重写这些部分来解决它们,以最大限度地减少锁定,这样可以更容易地维护代码(在重新获取可能释放的对象时减少错误检查)并消除一些开销。

我刚刚解决了我遇到的问题 – 堆栈损坏导致mutex.__data.__lock值在尝试pthread_mutex_lock调用之前被设置为一些荒谬的数字(40亿-h)。 看看你是否可以在执行锁定操作之前设置断点,或者在__lock的值上打印调试信息,并且我愿意在死锁发生之前将其置为无效。