将信号广播到Linux中的所有线程

我想从一个线程向进程中的所有其他线程广播信号。 接收该信号的线程应处理信号处理程序中的信号。 我怎样才能做到这一点?


我尝试了下面的代码,但它通过打印用户定义的信号退出1.发生什么事了?

#include <stdio.h> #include <signal.h> #include <sys/types.h> #include <pthread.h> const int NTHREADS = 4; long prev_fact, i; void SIGhandler(int); void SIGhandler(int sig) { printf("\nThread %lx Received a SIGUSR1.\n", pthread_self()); } void* tfunc( void* arg ) { printf( "Thread %lx executing...\n", pthread_self() ); while( 1 ) ; } int main() { int i; pthread_t t[NTHREADS]; for( i = 0; i < NTHREADS; i++ ) pthread_create( &t[i], NULL, tfunc, NULL ); for( i = 0; i < NTHREADS; i++ ) pthread_kill( t[i], SIGUSR1 ); for( i = 0; i < NTHREADS; ++i) pthread_join(t[i], NULL); return 0; } 

可移植pthreads的方式是循环所有线程,为每个线程执行pthread_kill() 。 这要求您维护表示进程中每个线程的所有pthread_t值的列表。

在Linux上,您可以读取/proc/self/task来确定当前进程中每个线程的TID,然后使用tgkill()来发信号(使用getpid()的结果作为tgid参数给tgkill() )。

请注意,glibc不提供tgkill()的包装 – 你必须使用syscall()syscall()它。

下面的代码现在可以工作…

 #include <stdio.h> #include <signal.h> #include <sys/types.h> #include <pthread.h> const int NTHREADS = 4; void SIGhandler(int); void SIGhandler(int sig) { printf("\nThread %lx Received a SIGUSR1.\n", pthread_self()); } void* tfunc( void* arg ) { printf( "Thread %d(%lx) executing...\n", *((unsigned int*)arg), pthread_self() ); while( 1 ) ; } int main() { int i; int tid[NTHREADS]; pthread_t t[NTHREADS]; signal(SIGUSR1, SIGhandler); for( i = 0; i < NTHREADS; i++ ) { tid[i] = i; pthread_create( &t[i], NULL, tfunc, tid+i ); } for( i = 0; i < NTHREADS; i++ ) pthread_kill( t[i], SIGUSR1 ); for( i = 0; i < NTHREADS; ++i) pthread_join(t[i], NULL); return 0; }