有没有一种方法可以阻止某些信号并取消阻止同一组中的其他信号?
我只是似乎没有把我的头!

一个例子

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;
    }
}

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

有人可以帮忙吗? :)

最佳答案



使用pthread_sigmask,您可以选择:

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

    换句话说,该线程有一组当前的阻塞信号,您可以按上述指定对其进行修改,一次只能执行一次操作。

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

    关于您的示例,我假设您正在尝试使printer_thread1SIGUSR2SIGALRM,并具有printer_thread2SIGUSR1SIGALRM,并具有主线程块SIGUSR1SIGUSR2,以便每个线程可以发送将被a单线程(没有printf1f2的代码,无法确定示例中的意图是什么)。

    您应该可以通过以下代码来实现:
    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;
        }
    }
    

    请参阅以下手册页:
  • pthread_sigmask
  • sigprocmask

  • 有关更多详细信息。

    关于c - posix线程阻塞信号并解除阻塞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13114678/

    10-11 23:03
    查看更多