posix线程阻塞信号并解除阻塞

时间:2012-10-29 00:55:06

标签: c multithreading signals posix block

有没有办法阻止某些信号并解锁同一组中的其他信号? 我只是似乎无法理解它!

一个例子

sigset_t set;
sigemptyset(&set);

sigaddset(&set, SIGUSR1);
// Block signal SIGUSR1 in this thread
pthread_sigmask(SIG_BLOCK, &set, NULL);
sigaddset(&set, SIGALRM);
// Listen to signal SIGUSR2
pthread_sigmask(SIG_UNBLOCK, &set, NULL);


pthread_t printer_thread1, printer_thread2;
pthread_create(&printer_thread1, NULL, print, (void *)&f1);
pthread_create(&printer_thread2, NULL, print, (void *)&f2);

bool tl = true;
while(1)
{
    if(tl)
    {
        // thread1 does something
        kill(pid, SIGUSR1);
        // main thread waits for SIGALRM
        sigwait(&set, &sig);
        tl = !tl;
    }
    else
    {
        // thread2 does something
        kill(pid, SIGUSR2);
        // main thread waits for SIGALRM
        sigwait(&set, &sig);
        tl = !tl;
    }
}

我不允许使用Mutexs,信号量等信号。

有人可以帮忙吗? :)

2 个答案:

答案 0 :(得分:10)

  

有没有办法阻止某些信号并解锁其他信号   同一套?

使用pthread_sigmask,您可以选择:

  • 使用常量SIG_BLOCK
  • 将一组信号添加到阻塞信号集
  • 使用常量SIG_UNBLOCK
  • 将一组信号移除到阻塞信号集
  • 使用常量SIG_SET
  • 定义要阻止的信号集

换句话说,线程有一组阻塞信号,你可以按照上面的说明修改它,一次一个操作。

重要的一点是新创建的线程继承了创建线程的信号掩码,因此您可以在创建新线程之前设置新线程的掩码,或者在您方便时在新线程运行的函数中设置掩码。

关于您的示例,我认为您尝试printer_thread1阻止SIGUSR2SIGALRMprinter_thread2阻止SIGUSR1和{{1}并且拥有主线程块SIGALRMSIGUSR1,这样每个线程都可以发送一个信号,该信号将由单个线程捕获(没有SIGUSR2的代码,{{ 1}}和print,我们无法确定你的例子中的意图是什么。)

您应该可以通过以下代码实现这一目标:

f1

请参阅这些手册页:

了解更多详情。

答案 1 :(得分:2)

我认为你想要做的是

// Block signal SIGUSR1 in this thread
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
pthread_sigmask(SIG_BLOCK, &set, NULL);

// Listen to signal SIGALRM
sigemptyset(&set);
sigaddset(&set, SIGALRM);
pthread_sigmask(SIG_UNBLOCK, &set, NULL);

该集仅用于告诉它阻止或解除阻塞的内容。一旦传递给命令,您可以自由地重置它并构建另一个信号掩码。如果跳过sigemptyset,该集合仍将包含SIGUSR1,随后将再次取消阻止。好吧,我认为这就是它的工作原理,至少 - 自从我使用信号以来已经很长时间了。