如何知道线程是否处于死锁状态?

时间:2017-10-04 15:07:35

标签: c multithreading embedded-linux deadlock

我创建了两个用C代码编写的线程,它在Linux OS上运行。两个线程都在做一些工作,并且它的父进程处于活动状态时它会永远运行。

创建这些线程的过程是以某个时间间隔向systemd发送监视通知。但是,在发送监视程序通知之前,它希望检查所有线程是否都处于非死锁状态。

在代码中可以使用什么系统调用或者可以使用什么机制来知道线程没有处于死锁状态,以便进程可以检查其创建的线程是否处于死锁状态,并且只发送看门狗如果所有线程都处于非死锁状态,则通知systemd

1 个答案:

答案 0 :(得分:1)

最简单的方法是让您需要跟踪的每个线程定期更新自己的共享变量。监视包括检查共享变量是否经常改变值。

考虑一个类比。你不经常回家,但你想确保你的两个孩子没有消失。所以每个孩子都有一个罐子。你告诉他们每回家就给罐子加一分钱。现在,每次回家,你都算上每个罐子里的便士。如果任何一个孩子的罐子已经用了相同数量的便士,你知道你有问题。

因此,例如,您可以修改每个执行工作的线程:

  1. 做一些工作。
  2. 转到1.
  3. 要:

    1. 做一些工作。
    2. 增加我的进度变量。
    3. 转到第1步。
    4. 然后监控线程必须跟踪上次看到状态变量和当前值的不同值。然后它可以检测死锁线程,如下所示:

      1. 遍历我们正在监控的每个主题。
      2. 它的状态变量是否与上次不同?如果没有,请转到步骤5.
      3. 存储我们为其状态变量看到的值并存储当前时间。
      4. 继续我们在第1步开始的循环。
      5. 我们为此主题的最后一次更新存储的时间是否过去?如果是,请报告死锁。
      6. 继续我们在第1步开始的循环。