我想编写一个程序,在SIGIO
时,表示我的线程池中的所有线程。我编写了以下代码,但看起来套接字一次只能由一个线程拥有,因此只会通知我的线程池中的最后一个线程事件。有没有什么方法可以在不使用专用的信号捕获线程且没有主进程被中断的情况下获得我想要的行为?
void sigFunc(int signo){
printf("SIGNAL %li!\n", gettid());
return;
}
static void* poolFunc(){
printf("Pool func... %li\n", gettid());
fcntl(lsocket, F_SETOWN, gettid());
for(;;)
sleep(1);
return NULL;
}
int main(int argc, char *argv[]){
unsigned char val;
int lsocket;
pthread_t pool[4];
lsocket = socket(AF_INET, SOCK_STREAM, 0);
// Omitted 15 lines of setting up lsocket, this part is boring
fcntl(lsocket, F_SETFL, fcntl(lsocket, F_GETFL) | O_ASYNC);
signal(SIGIO, sigFunc);
for(val=0; val < 4; val++){
if(pthread_create(&pool[val], NULL, poolFunc, NULL) != 0){
printf("Creation of thread pool failed!\n");
exit(1);
}
if(pthread_detach(pool[val]) != 0){
printf("Failed to detach thread in pool...?\n");
exit(1);
}
}
printf("Starting main loop...\n");
for(;;)
sleep(1);
}
输出:
$ ./program
游泳池功能... 17580
游泳池功能... 17582
池功能... 17581
游泳池功能... 17583
游泳池功能... 17584
启动主循环...
SIGNAL 17584!
SIGNAL 17584!
SIGNAL 17584!
SIGNAL 17584!
SIGNAL 17584!
^ C$ ./program
游泳池功能... 17621
游泳池功能... 17620
游泳池功能... 17623
游泳池功能... 17624
游泳池功能... 17622
启动主循环...
SIGNAL 17622!
SIGNAL 17622!
SIGNAL 17622!
SIGNAL 17622!
SIGNAL 17622!
^ C
答案 0 :(得分:1)
信号处理正处于流程级别。
这意味着只有一个进程的一个线程会收到一个发送给进程的信号。
换句话说:从流程外部只有一个流程&#39;线程可以发出信号。
发信号通知进程pthread_kill()
中的所有线程可以被每个进程使用&#39; 拥有个帖子。为此,该过程需要跟踪其所有现有(已创建且仍然存活)的线程。