gpt4 book ai didi

c - posix 线程阻塞信号和解除阻塞

转载 作者:太空狗 更新时间:2023-10-29 17:17:57 28 4
gpt4 key购买 nike

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

一个例子

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

我不允许只使用互斥量、信号量等信号。

有人可以帮忙吗? :)

最佳答案

Is there a way to block certain signals and unblock other signals in the same set?

使用pthread_sigmask,您可以选择:

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

换句话说,当前线程有一组阻塞信号,您可以按上面指定的方式修改它,一次一个操作。

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

关于您的示例,我想您正在尝试让 printer_thread1 阻止 SIGUSR2SIGALRM,并让 printer_thread2 block SIGUSR1SIGALRM,并有主线程 block SIGUSR1SIGUSR2,这样每个线程都可以发送一个将被单个线程捕获的信号(没有 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;
}
}

查看这些手册页:

了解更多详情。

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com