在实时应用程序中检测死锁的方法

时间:2017-04-25 23:31:19

标签: multithreading thread-safety deadlock

  1. 在实时多线程应用程序中检测死锁的方法有哪些?

  2. 如果我们发现存在死锁,有没有办法解决它,而无需关闭/重新启动应用程序?

2 个答案:

答案 0 :(得分:1)

有两种常用的方法可以检测死锁。

一种是让线程设置检查点。例如,如果您有一个具有工作循环的线程,那么您在工作开始时设置一个计时器,其设置时间比您认为工作可能花费的时间长。如果计时器触发,则表示该线程已死锁。完成工作后,您取消计时器。

另一个(有时组合使用)是让线程可以阻止线程可能拥有的其他资源。当其他线程以相反的顺序获取这些锁时,这可以直接检测获取一个锁的尝试,同时保持另一个锁。

这甚至可以在没有实际发生死锁的情况下检测死锁风险。如果一个线程获得锁A然后B获得锁B然后获取锁A,则除非它们重叠,否则没有死锁。但是这种方法可以检测到它。

高级死锁检测通常仅在调试期间使用。除了编写应用程序以检查每个阻塞锁以查找可能的死锁并知道如果发生了该怎么做,在死锁之后你唯一可以做的就是撕掉应用程序。您不能盲目释放锁,因为它们保护的资源可能处于不一致状态。

有时你故意编写你知道可能会死锁的代码,并专门编写代码来避免这个问题。例如,如果您知道许多线程采用锁A然后尝试获取锁B,而其他一些线程需要反向执行,您可以编写代码执行非阻塞尝试来锁定B并释放锁A如果失败

通常情况下,花费你的努力使死锁成为可能更有用,而不是让代码检测并解决死锁问题。

答案 1 :(得分:0)

Python具有称为faulthandler的功能,对于处理死锁非常有用:

import faulthandler
faulthandler.register(signal.SIGUSR1)

如果您使用的是C ++或任何使用glibc的编译器,则可以使用execinfo.h中的backtrace()函数来打印堆栈跟踪并在收到信号时正常退出。您可以采用死锁的程序,向其发送信号并获取所有线程的列表。

在Java中,在卡住的进程上使用jstack <pid>