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

Max*_*Max 6 c multithreading posix signals 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮忙吗?:)

did*_*erc 11

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

有了pthread_sigmask,你可以选择:

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

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

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

关于你提到的例子,我想,你想有printer_thread1SIGUSR2SIGALRM,并有printer_thread2SIGUSR1SIGALRM,并有主线程块SIGUSR1SIGUSR2,使每个线程都可以发送将由单个线程捕获的信号(没有的代码print,f1并且f2,不可能确切地知道你的例子中的意图是什么).

您应该能够通过以下代码实现:

sigset_t set;
pthread_t printer_thread1, printer_thread2;


// Block signal SIGUSR1 & SIGALRM in printer_thread1
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGALRM);
pthread_sigmask(SIG_SET, &set, NULL);
pthread_create(&printer_thread1, NULL, print, (void *)&f1);

// Block signal SIGUSR2 & SIGALRM in printer_thread2
sigaddset(&set, SIGUSR2);
sigaddset(&set, SIGALRM);
pthread_sigmask(SIG_SET, &set, NULL);
pthread_create(&printer_thread2, NULL, print, (void *)&f2);

// Block signal SIGUSR1 & SIGUSR2 in the main thread
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGUSR2);
// Listen to signal SIGALRM
pthread_sigmask(SIG_SET, &set, NULL);


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;
    }
}
Run Code Online (Sandbox Code Playgroud)

看这些手册页:

了解更多详情.