gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:41 26 4
gpt4 key购买 nike

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

为 SIGUSR1 重载信号处理程序:

  1. 它暂停程序的所有运行线程,但我们无权访问 pids 列表或类似信息。即使线程直接通过 pthreads 使用或者它们是 OpenMP 实例也不会。

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

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

到目前为止,我读到的有关线程信号处理的内容是,如果将信号发送到进程,程序的任意线程将处理该信号。但这对我没有帮助。

最佳答案

你做错了。

即使您以某种方式设法使用单个信号挂起所有线程(您可以这样做,只需使用 SIGSTOP),您也无法完成您想做的事情。

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

你也不应该。这样的结构非常困难,而且不会产生任何好处。

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

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

关于c - 使用信号挂起 Linux 程序的所有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47132856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com