【发布时间】:2016-06-06 07:14:10
【问题描述】:
在 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() 将拾取并解除阻塞。但由于某种原因,这不起作用。这可能是一个早期的设计决定,我很好奇为什么它不起作用。
【问题讨论】: