我创建了两个用 C 代码编写的线程,它在 Linux 操作系统上运行。两个线程都在做一些工作,并且当其父进程处于事件状态时,它会永远运行。
创建这些线程的进程正在以一定的时间间隔向systemd
发送看门狗通知。然而,在发送看门狗通知之前,它要检查所有线程是否处于非死锁状态。
在代码中可以使用什么系统调用,或者说可以使用什么机制来知道线程没有处于死锁状态,以便进程可以检查其创建的线程是否处于死锁状态,并且只发送看门狗如果所有线程都处于非死锁状态,则通知 systemd
。
最佳答案
最简单的方法是让您需要跟踪的每个线程定期更新其自己的共享变量。监视包括检查共享变量是否足够频繁地更改值。
考虑一个类比。您不常回家,但您想确保您的两个 child 没有失踪。所以你为每个 child 都有一个 jar 。你告诉他们每次回家时在 jar 里加一分钱。现在,每次你回家,你都会数每个 jar 里的硬币。如果任何 child 的 jar 里长时间存放相同数量的便士,您就知道自己有问题了。
因此,例如,您可以修改每个正在工作的线程:
- 做一些工作。
- 转到 1。
致:
- 做一些工作。
- 增加我的进度变量。
- 转到步骤 1。
然后,监视线程只需跟踪上次看到状态变量的不同值和当前值的时间。然后它可以检测死锁线程,如下所示:
- 循环我们正在监控的每个线程。
- 它的状态变量与上次不同吗?如果没有,请转到步骤 5。
- 存储我们看到的状态变量值并存储当前时间。
- 继续我们在第 1 步中开始的循环。
- 我们为此线程上次更新存储的时间是否太早了?如果是这样,请报告死锁。
- 继续我们在第 1 步中开始的循环。
关于c - 如何知道线程是否处于死锁状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46568234/