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