有没有一种方法可以阻止某些信号并取消阻止同一组中的其他信号?
我只是似乎没有把我的头!
一个例子
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_thread1
块SIGUSR2
和SIGALRM
,并具有printer_thread2
块SIGUSR1
和SIGALRM
,并具有主线程块SIGUSR1
和SIGUSR2
,以便每个线程可以发送将被a单线程(没有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;
}
}
请参阅以下手册页:
有关更多详细信息。
关于c - posix线程阻塞信号并解除阻塞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13114678/