多个线程接收到一个信号

时间:2015-12-17 00:40:45

标签: c multithreading pthreads signals posix

我正在尝试编写一个可以创建10个线程的程序。收到SIGUSR1信号后的那些线程应该全部停止,并且在收到SIGUSR2之后应该继续做他们正在做的事情。

我已经写了这段代码(顺便说一句。你也可以检查一下它的正确性吗?谢谢!)但我认为当信号SIGUSR1发生时,只有1个线程会收到并处理它(这意味着只有1个线程将继续其工作...)。

如何使所有等待的线程继续工作?

void handle_sigusr1()
{
    int sig;
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGUSR2);
    printf("Thread waiting for some signal SIGUSR2! \n");
    sigwait(&set, &sig);
}

void install_sigusr1()
{
  struct sigaction setup_action;
  sigset_t block_mask;

  sigfillset(&block_mask);
  setup_action.sa_handler = handle_sigusr1;
  setup_action.sa_mask = block_mask;
  setup_action.sa_flags = 0;
  if (sigaction (SIGUSR1, &setup_action, 0) == -1)
    fprintf(stderr, "sigaction2 err");
}

void* test_thread_func(void * data)
{
    while(1)
    {
        ...
        Some SIGUSR1 signal may occur ...
        ...
    }
}

void create_threads()
{
    pthread_t TH[10];
    int i;
    sigset_t set;
    sigfillset(&set);
    sigdelset(&set, SIGUSR1);
    sigdelset(&set, SIGUSR2);
    pthread_sigmask(SIG_SETMASK, &set, NULL);
    install_sigusr1();
    /* Block all signals except for SIGUSR1 and SIGUSR2. New Threads will
         inherit the sigmask ...*/
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    for(i = 0; i < 10; i++)
    {
        pthread_create(TH[i], &attr, test_thread_func, 0);
    }
    // now we unblock SIGINT so that the main thread only can handle SIGINT signal
    sigdelset(&set, SIGINT);
    // we dont want the main thread to handle SIGUSRs signals ...
    sigaddset(&set, SIGUSR1);
    sigaddset(&set, SIGUSR2);
    pthread_sigmask(SIG_SETMASK, &set, NULL);
    while(1);
}

1 个答案:

答案 0 :(得分:1)

  

如何使所有等待的线程继续工作?

pthread_cond_broadcast()函数将取消阻止当前在指定条件变量cond上阻塞的所有线程。

  

我写过这段代码(顺便说一下。你能不能检查一下   正确吗?)

对于这篇文章您的完整代码。这是我可以从你的问题中告诉你的事情。