实际上如何在UNIX上找到进程死锁的原因?
收藏

在unix上,进程卡住了,您怀疑它可能是死锁,找到死锁的原因以及如何删除和避免它?
我知道死锁的四个条件:
互斥:一个资源一次最多只能分配给一个进程(不共享)。
保持和等待:允许保持资源的处理请求另一个资源。
没有抢占权:进程必须释放其资源;它们不能被夺走。
循环等待:必须有一个进程链,以便链的每个成员都在等待链的下一个成员所拥有的资源。
但是,它们是理论上的,如何实际确定unix上的死锁?
只有看到一个过程没有进步?
如何找出代码的哪个部分导致死锁和原因?
如果允许使用工具,可以使用什么?
谢谢


最佳答案:

还有Valgrind的Helgrind工具:Helgrind: a thread error detector
Helgrind是一个ValGRD工具,用于检测使用POSIX p螺纹线程原语的C、C++和FORTRAN程序中的同步错误。
POSIX代码库中的主要抽象是:共享一个公共地址空间的线程集、线程创建、线程连接、线程退出、线程(锁)、条件变量(线程间事件通知)、读写器锁、多线程、信号量和障碍。
Helgrind可以检测三类错误,下面三节将详细讨论这些错误:
Misuses of the POSIX pthreads API
Potential deadlocks arising from lock ordering problems
Data races -- accessing memory without adequate locking or synchronisation
像这样的问题通常会导致无法生产、依赖时间的崩溃、死锁和其他错误行为,并且很难通过其他方式找到。
helgrind知道所有pthread抽象并尽可能精确地跟踪它们的效果。在x86和amd64平台上,它理解并部分处理由于使用lock指令前缀而产生的隐式锁定。
当您的应用程序只使用posix pthreads api时,helgrind工作得最好。但是,如果您想使用自定义线程原语,可以使用helgrind.h中定义的annotate_*macros描述它们在helgrind中的行为。这个功能是在valgrind的3.5.0版中添加的,被认为是实验性的。

公众号