为什么 sigwait() 不考虑 sigset 的变化?
Why doesn't sigwait() respect changes in sigset?
在 pthreads 中:假设我有一个线程来处理 CTRL+C 输入,初始化为:
sigemptyset(&set);
sigaddset(&set, SIGINT);
pthread_sigmask(SIG_BLOCK, &set, NULL);
pthread_create(&ctrlc_handler, NULL, ctrlc_handler_impl, data);
然后线程启动并使用 sigwait() 等待 SIGINT 为:
int signal;
sigwait(&set, &signal);
现在,如果我需要取消阻止(并且不取消或销毁)这个线程,这是我唯一能做的现在是用 pthread_kill(..., SIGINT)
显式发送 SIGINT。虽然这很好用,但感觉非常干扰和断章取义。或许通过使用 sigdelset(&set, SIGINT)
从 sigset 中删除 SIGINT 来简单地解锁该线程会更清晰。由于 sigset 变空,sigwait() 将拾取它并解除阻塞。但由于某种原因,这是行不通的。这可能是早期的设计决定,我很好奇为什么它不起作用。
传递到 sigwait
的信号集的第一个障碍很可能是在内核中复制的;同时你正在操纵原始副本。
specification of sigwait 中没有任何内容表明从另一个线程操纵 set
对等待线程有任何影响。
这样的规范是相当不合理的,因为它会增加对用户 space 中数据对象的内存操作的要求,以达到陷入调度程序以唤醒线程的效果.
在 pthreads 中:假设我有一个线程来处理 CTRL+C 输入,初始化为:
sigemptyset(&set);
sigaddset(&set, SIGINT);
pthread_sigmask(SIG_BLOCK, &set, NULL);
pthread_create(&ctrlc_handler, NULL, ctrlc_handler_impl, data);
然后线程启动并使用 sigwait() 等待 SIGINT 为:
int signal;
sigwait(&set, &signal);
现在,如果我需要取消阻止(并且不取消或销毁)这个线程,这是我唯一能做的现在是用 pthread_kill(..., SIGINT)
显式发送 SIGINT。虽然这很好用,但感觉非常干扰和断章取义。或许通过使用 sigdelset(&set, SIGINT)
从 sigset 中删除 SIGINT 来简单地解锁该线程会更清晰。由于 sigset 变空,sigwait() 将拾取它并解除阻塞。但由于某种原因,这是行不通的。这可能是早期的设计决定,我很好奇为什么它不起作用。
传递到 sigwait
的信号集的第一个障碍很可能是在内核中复制的;同时你正在操纵原始副本。
specification of sigwait 中没有任何内容表明从另一个线程操纵 set
对等待线程有任何影响。
这样的规范是相当不合理的,因为它会增加对用户 space 中数据对象的内存操作的要求,以达到陷入调度程序以唤醒线程的效果.