sho*_*nex 6 c linux multithreading posix pthreads
我正在编写一个程序,有一个主线程和一些工作线程,我想让信号处理正确.我的问题如下:
主线程启动并执行所有分配
主线程设置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);
}
Run Code Online (Sandbox Code Playgroud)
我期待的是,一旦接收到SIGINT,所有线程将用另一个信号发出信号,退出阻塞呼叫,看到g_do_cleanup标志并优雅地退出.
欢迎任何关于如何正确执行此操作的评论或链接.
编辑:我不是在寻找一种方法来唤醒多个线程等待特定条件,所以我不认为pthread_cond_signal方法是我正在寻找的.我想要的是:
这是我通常在主应用程序线程中执行的操作:
/* before starting other threads */
sigset_t sigs;
sigemptyset( &sigs );
sigaddset( &sigs, SIGTERM );
sigaddset( &sigs, SIGINT );
/* add other signals to handle */
if ( pthread_sigmask( SIG_BLOCK, &sigs, 0 )) { /* handle error */ }
/* can start threads now */
...
/* in the main event loop */
siginfo_t info;
if ( sigwaitinfo( &sigs, &info ) == -1 ) { /* handle error */ }
switch( info.si_signo )
{
case SIGTERM:
case SIGINT: /* raise shutdown event */ break;
default: /* other actions - log rotation, etc. */
}
...
Run Code Online (Sandbox Code Playgroud)
这样信号就变成了常规的应用程序事件——没有特殊的信号上下文限制等。等待也可以通过超时来完成sigtimedwait,尽管 BSD 衍生品不支持它。