在开发分析框架期间,我遇到了以下问题,如果程序收到信号(例如SIGUSR1),我需要暂停所有正在运行的线程(包括主线程),如果有的话我感兴趣可以在Linux / POSIX系统上实现以下工作流程:
重载SIGUSR1的信号处理程序,其执行:
它暂停程序的所有正在运行的线程,但是我们无法访问pid列表或类似信息。如果线程直接通过pthread使用或者它们是OpenMP实例,即使不是。
将所有收集到的数据写入光盘(此处不关注它们的来源)。但是写入过程会影响分析收集的一些运行时数据,因此需要停止所有线程。
编写分析数据后继续所有线程。
到目前为止我读到的关于线程信号处理的东西是,如果信号被发送到进程,程序的任意线程将处理信号。但这对我没有帮助。
答案 0 :(得分:2)
你的做法是错误的。
即使你以某种方式设法使用单个信号暂停所有线程(你可以使用SIGSTOP
),但你无法做你想做的事情。
您尝试做的事情称为“全局快照”。您希望以一致的方式转储线程的状态。信号的问题在于,它很可能会在计算中捕获一些线程。您不太可能构建每个线程的活动,以便在每个纳秒执行时在内存中具有一致的数据。
你也不应该。这样的结构是非常困难的,并没有带来任何好处。
相反,您应该创建一个数据转储,因为可能已经了。这意味着您不需要转储实际代表程序执行期间的某个时刻。它只需要表示您的程序可能所处的状态。
最好的方法是,恕我直言,将快照的代码内联到每个线程的代码中。使用信号设置一个表示需要快照的变量,然后让每个线程在其内部数据一致且准备好进行快照时暂停。