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

标签 c multithreading embedded-linux deadlock

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

创建这些线程的进程正在以一定的时间间隔向systemd发送看门狗通知。然而,在发送看门狗通知之前,它要检查所有线程是否处于非死锁状态。

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

最佳答案

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

考虑一个类比。您不常回家,但您想确保您的两个 child 没有失踪。所以你为每个 child 都有一个 jar 。你告诉他们每次回家时在 jar 里加一分钱。现在,每次你回家,你都会数每个 jar 里的硬币。如果任何 child 的 jar 里长时间存放相同数量的便士,您就知道自己有问题了。

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

  1. 做一些工作。
  2. 转到 1。

致:

  1. 做一些工作。
  2. 增加我的进度变量。
  3. 转到步骤 1。

然后,监视线程只需跟踪上次看到状态变量的不同值和当前值的时间。然后它可以检测死锁线程,如下所示:

  1. 循环我们正在监控的每个线程。
  2. 它的状态变量与上次不同吗?如果没有,请转到步骤 5。
  3. 存储我们看到的状态变量值并存储当前时间。
  4. 继续我们在第 1 步中开始的循环。
  5. 我们为此线程上次更新存储的时间是否太早了?如果是这样,请报告死锁。
  6. 继续我们在第 1 步中开始的循环。

关于c - 如何知道线程是否处于死锁状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46568234/

相关文章:

linux - 如何读取/解析文件 syscall_32.tbl 以及谁在构建 Linux 内核时执行此操作?

linux - fsync,同步 : does it really do what its supposed to?

C++ 运行时调试(诊断策略和构造)

linux - 在启动辅助 cpu 时通过哪个指令触发辅助核心

c - C 中 extern 关键字的行为

c - 断言错误: involving the fscanf function

c++ - C 条件运算符的令人困惑的结果

c - 序列化其中包含 union 和结构的结构

java - 实例同步

java - 如何用htmlunit解决Java堆空间问题