在开发分析框架期间,我遇到了以下问题:如果程序接收到信号(例如SIGUSR1 ),我需要挂起所有正在运行的线程(包括主线程),并且我感兴趣的是是否有可能在Linux/POSIX系统上实现以下工作流:
重载SIGUSR1的信号处理程序,这样做:
到目前为止,我所读到的关于线程信号处理的内容是,如果一个信号被发送到一个进程,程序中的任意线程将处理该信号。但这对我没什么帮助。
发布于 2017-11-06 08:57:26
你走错路了。
即使您设法使用单个信号(您可以使用SIGSTOP)挂起所有线程,您也无法完成您想要做的事情。
您想要做的是所谓的“全局快照”。您希望以一致的方式转储线程的状态。信号的问题是,它很可能会在计算过程中捕捉到一些线程。您不太可能组织每个线程的活动,使其在每一纳秒的执行中都有一致的数据。
你也不应该。这样的结构是疯狂的困难,没有任何好处。
相反,您应该创建数据的转储,因为它可能是。这意味着您不需要转储实际上表示程序执行过程中的某个时刻。它只需要表示您的程序可能已处于的状态。
这样做的最佳方法,IMHO,是将快照的代码内联到每个线程的代码中。使用一个信号来设置一个变量,说明需要快照,然后让每个线程在其内部数据一致并为快照做好准备时将自己挂起。
https://stackoverflow.com/questions/47132856
复制相似问题