gpt4 book ai didi

c - pthread 信号不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 04:29:19 25 4
gpt4 key购买 nike

在我的程序中,我希望线程 A 定期向线程 B 发送 SIGUSR1。在线程 B 中,它会在 sigwait 处阻塞。至于收到SIGUSR1后怎么办,我还没有定义。下面是我的代码。但是,程序立即终止,输出为 User defined signal 1

void usr1_handler();

int main(int argc, char const *argv[])
{
pthread_t tid;
pthread_attr_t attr_obj;
void *thread(void *);

pthread_attr_init(&attr_obj);
pthread_attr_setdetachstate(&attr_obj, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr_obj, thread, (void *)NULL);

while(1)
{
int ret = pthread_kill(tid, SIGUSR1);
sleep(5);
}
return 0;
}

void *thread(void *dummy)
{
int sig;
sigset_t sigmask;
struct sigaction action;

/* set up signal mask to block all in main thread */
sigfillset(&sigmask);
pthread_sigmask(SIG_BLOCK, &sigmask, (sigset_t *)0);

for (;;)
{
int err = sigwait(&sigmask, &sig);
/* define what to do with sig here */
printf("sig is %d\n", sig);
}

pthread_exit((void *)NULL);
}

最佳答案

你做错了。您明确安排 SIGUSR1 在线程中解除阻塞,但这恰恰是错误的做法。一些文档没有说清楚(例如 sigwait() 的 Linux 联机帮助页),但是 POSIX says :

The signals defined by set shall have been blocked at the time of the call to sigwait(); otherwise, the behavior is undefined.

(强调已添加。)

但是,不要忽视@AndrewHenle 和@2501 关于竞争条件的评论。你也有。我同意 @2501 的观点,解决这个问题的最简单方法是在主线程中设置信号掩码,以便其他线程继承它。不要在启动另一个线程后恢复主线程的信号掩码,否则您可能会发现您的程序很难被杀死。

关于c - pthread 信号不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38225884/

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