我已经在这个工作了几天 -
作为背景,我正在研究一个单线程C程序并使其成为多线程的。我最近发现了一个新的死锁情况,但是当我看到gdb中的互斥锁时,我看到了
__ lock = 2但__owner = 0
这不是递归的互斥锁。有没有人见过这个?我正在处理的程序是一个守护程序,这种情况只发生在以高吞吐率执行超过20分钟(大约)然后放松负载之后。如果您有任何想法,我将不胜感激。
编辑 - 我忽略了提及我的所有其他线程此时都处于空闲状态。
干杯
答案 0 :(得分:5)
这是可以预料的。普通(非递归,非错误检查)互斥锁无需存储其所有者,并且可以保存一些时间来跳过查找调用者的线程ID的步骤。 (这在x86上几乎没有什么区别,但在像MIPS这样的平台上可能会有很大差异,因为没有线程寄存器,并且线程ID会导致内核空间出现故障。)
你看到的死锁几乎肯定是由于线程试图锁定它已经存在的互斥锁,或者是一个实际的逻辑错误,其中两个或多个线程都在等待另一个互斥的互斥锁。
答案 1 :(得分:1)
据我所知,这是由于pthread库的限制。每当我发现部分代码使用过多的锁定和解锁并严重强调代码部分时,我就遇到过这种情况。我通过重写这些部分来解决它们,以最大限度地减少锁定,这样可以更容易地维护代码(在重新获取可能释放的对象时减少错误检查)并消除一些开销。
答案 2 :(得分:1)
我刚刚解决了我遇到的问题 - 堆栈损坏导致mutex.__data.__lock
值在尝试pthread_mutex_lock
调用之前被设置为一些荒谬的数字(40亿-h)。看看您是否可以在执行锁定操作之前设置断点,或打印__lock
的值的调试信息,并且我愿意在死锁发生之前将其置于无效之前。