【问题标题】:Why doesn't sigwait() respect changes in sigset?为什么 sigwait() 不尊重 sigset 的变化?
【发布时间】: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() 将拾取并解除阻塞。但由于某种原因,这不起作用。这可能是一个早期的设计决定,我很好奇为什么它不起作用。

【问题讨论】:

    标签: kernel pthreads posix


    【解决方案1】:

    传递给sigwait 的信号集的第一个障碍很可能是在内核内部复制的;与此同时,您正在处理原始副本。

    specification of sigwait 中没有任何内容表明从另一个线程操作 set 会对等待线程产生任何影响。

    这样的规范是相当不合理的,因为它会增加对用户空间中数据对象的内存操作的要求,以产生陷入调度程序以唤醒线程的效果。

    【讨论】:

    • 是的,这是有道理的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 2015-03-14
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多