SIGIO只通知线程池中的最后一个线程

时间:2017-06-28 07:01:12

标签: c multithreading signals threadpool

我想编写一个程序,在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

1 个答案:

答案 0 :(得分:1)

信号处理正处于流程级别。

这意味着只有一个进程的一个线程会收到一个发送给进程的信号。

换句话说:从流程外部只有一个流程&#39;线程可以发出信号。

发信号通知进程pthread_kill()中的所有线程可以被每个进程使用&#39; 拥有个帖子。为此,该过程需要跟踪其所有现有(已创建且仍然存活)的线程。