我正在编写一个程序,其中包含一个主线程和一些工作线程,并且我希望正确处理信号。我的问题如下:
- 主线程启动并进行所有分配。 - 主线程设置SIGINT信号处理程序。 - 主线程启动工作线程。工作线程不需要特殊的清理,但它们可以在系统调用或信号量上睡眠。
当接收到SIGINT时,我的理解是只有一个线程会接收到它。因此,如果线程正在系统调用或信号量上睡眠,则它们不会被唤醒,我将无法pthread_join我的工作线程并在主线程中执行所有必要的清理工作。
以下信号处理程序能否解决我的问题?
我希望的是,在收到SIGINT信号后,所有线程都会被另一个信号通知,退出它们的阻塞调用,查看标志并优雅地退出。欢迎提供任何有关如何正确实现此功能的评论或链接。
编辑: 我不是在寻找唤醒等待特定条件的多个线程的方法,因此我不认为pthread_cond_signal方法是我要寻找的。我想要的是:
- 找到一种方式,使所有被阻塞调用的线程从这些调用中返回。 - 或者杀死除主线程之外的所有线程。
- 主线程启动并进行所有分配。 - 主线程设置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信号后,所有线程都会被另一个信号通知,退出它们的阻塞调用,查看标志并优雅地退出。欢迎提供任何有关如何正确实现此功能的评论或链接。
编辑: 我不是在寻找唤醒等待特定条件的多个线程的方法,因此我不认为pthread_cond_signal方法是我要寻找的。我想要的是:
- 找到一种方式,使所有被阻塞调用的线程从这些调用中返回。 - 或者杀死除主线程之外的所有线程。