使用信号挂起Linux程序的所有线程

时间:2017-11-06 08:45:20

标签: c linux multithreading

在开发分析框架期间,我遇到了以下问题,如果程序收到信号(例如SIGUSR1),我需要暂停所有正在运行的线程(包括主线程),如果有的话我感兴趣可以在Linux / POSIX系统上实现以下工作流程:

重载SIGUSR1的信号处理程序,其执行:

  1. 它暂停程序的所有正在运行的线程,但是我们无法访问pid列表或类似信息。如果线程直接通过pthread使用或者它们是OpenMP实例,即使不是。

  2. 将所有收集到的数据写入光盘(此处不关注它们的来源)。但是写入过程会影响分析收集的一些运行时数据,因此需要停止所有线程。

  3. 编写分析数据后继续所有线程。

  4. 到目前为止我读到的关于线程信号处理的东西是,如果信号被发送到进程,程序的任意线程将处理信号。但这对我没有帮助。

1 个答案:

答案 0 :(得分:2)

你的做法是错误的。

即使你以某种方式设法使用单个信号暂停所有线程(你可以使用SIGSTOP),但你无法做你想做的事情。

您尝试做的事情称为“全局快照”。您希望以一致的方式转储线程的状态。信号的问题在于,它很可能会在计算中捕获一些线程。您不太可能构建每个线程的活动,以便在每个纳秒执行时在内存中具有一致的数据。

你也不应该。这样的结构是非常困难的,并没有带来任何好处。

相反,您应该创建一个数据转储,因为可能已经了。这意味着您不需要转储实际代表程序执行期间的某个时刻。它只需要表示您的程序可能所处的状态。

最好的方法是,恕我直言,将快照的代码内联到每个线程的代码中。使用信号设置一个表示需要快照的变量,然后让每个线程在其内部数据一致且准备好进行快照时暂停。