在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);
现在,如果我需要取消阻止(并且不取消或销毁)此线程,我现在能够做到的唯一方法就是发送一个SIGINT明确地使用pthread_kill(..., SIGINT)
。虽然这种方法效果很好,但它感觉非常具有侵入性和脱离背景。也许通过使用:sigdelset(&set, SIGINT)
从sigset中删除SIGINT来简单地取消阻塞此线程会更清晰。由于sigset变空,sigwait()会选择它并取消阻塞。但由于某种原因,这不起作用。这可能是一个早期的设计决定,我很好奇为什么它不起作用。
答案 0 :(得分:4)
传递到sigwait
的信号集的第一个障碍很可能被复制到内核中;与此同时,你正在操纵原始副本。
specification of sigwait中没有任何内容表示从另一个线程操纵set
会对等待线程产生任何影响。
这样的规范是相当不合理的,因为它会增加对用户空间中的数据对象的内存操作的要求,以便捕获到调度程序中以唤醒线程。