我正在编写一个程序,有一个主线程和一些工作线程,我想正确处理信号。我的问题如下:
主线程启动并进行所有分配
主线程设置一个 SIGINT 信号处理程序
主线程启动工作线程。工作线程不需要特殊的清理,但是它们可以在系统调用或信号量上休眠。
当收到 SIGINT 时,我的理解是只有一个线程收到它。因此,如果线程在系统调用或信号量上处于休眠状态,它们将不会被唤醒,并且我将无法 pthread_join 我的工作线程并在我的主线程中进行所有必要的清理。
以下信号处理程序可以解决我的问题吗?
void term(int sig)
{
g_do_cleanup = 1;
pthread_kill(worker_1_id, some_other_signal);
...
pthread_kill(worker_2_id, some_other_signal);
}
我期望的是,在收到 SIGINT 后,所有线程都会收到另一个信号,退出阻塞调用,看到g_do_cleanup
标志并优雅地退出。
欢迎任何关于如何正确执行此操作的评论或链接。
编辑:我不是在寻找一种方法来唤醒等待特定条件的多个线程,所以我不认为 pthread_cond_signal 方法是我正在寻找的。我想要的是:
- 找到一种方法,使在阻塞调用中被阻塞的所有线程都从这些调用中返回。
- 或者杀死除主线程之外的所有线程。