首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用信号挂起Linux程序的所有线程。

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

Stack Overflow用户
提问于 2017-11-06 08:45:19
回答 1查看 884关注 0票数 1

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

重载SIGUSR1的信号处理程序,这样做:

  1. 它挂起程序的所有正在运行的线程,但是我们不能访问pids列表或类似的信息。即使这些线程直接通过p线程使用,或者它们是OpenMP实例,也是如此。
  2. 将收集到的所有数据写入光盘(它们的来源在这里没有意义)。但是写进程会影响分析收集的一些运行时数据,因此需要停止所有线程。
  3. 写入分析数据后,继续所有线程。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-06 08:57:26

你走错路了。

即使您设法使用单个信号(您可以使用SIGSTOP)挂起所有线程,您也无法完成您想要做的事情。

您想要做的是所谓的“全局快照”。您希望以一致的方式转储线程的状态。信号的问题是,它很可能会在计算过程中捕捉到一些线程。您不太可能组织每个线程的活动,使其在每一纳秒的执行中都有一致的数据。

你也不应该。这样的结构是疯狂的困难,没有任何好处。

相反,您应该创建数据的转储,因为它可能是。这意味着您不需要转储实际上表示程序执行过程中的某个时刻。它只需要表示您的程序可能已处于的状态。

这样做的最佳方法,IMHO,是将快照的代码内联到每个线程的代码中。使用一个信号来设置一个变量,说明需要快照,然后让每个线程在其内部数据一致并为快照做好准备时将自己挂起。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47132856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档