首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程程序中异步信号的处理

多线程程序中异步信号的处理
EN

Stack Overflow用户
提问于 2011-06-03 05:08:59
回答 3查看 4.8K关注 0票数 13

Linux编程接口书提到了一种在多线程程序中处理异步信号的方法:

  • 所有线程阻塞进程可能接收的所有异步信号。最简单的方法是在创建任何其他线程之前阻止主线程中的信号。随后创建的每个线程都将继承主线程信号掩码的副本。
  • 创建一个使用sigwaitinfo()sigtimedwait()sigwait()接收传入信号的专用线程。

这种方法的优点是同步接收异步产生的信号。由于接受传入信号,专用线程可以安全地修改共享变量(在互斥控制下)并调用非异步安全函数。它还可以对条件变量进行信号处理,还可以对其他线程和进程进行通信和同步。

现在的问题是:

  1. 当内核想要传递信号时,它会选择进程中任意一个线程。从哪里可以知道如何将信号传送到专用线程?
  2. pthread是不安全的函数.那么我们如何在信号处理程序中使用它们呢?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-03 05:32:01

当内核传递一个进程导向的信号时,它会选择一个没有阻止信号的线程。这意味着,除了信号处理线程之外,它从来不选择任何线程(在sigwaitinfo()或类似的线程中阻止信号时,它的作用就像解除信号阻塞一样)。换句话说:内核知道在哪里传递信号,因为您已经安排了一些事情,使得信号处理线程是唯一允许将信号传递给的线程。

在信号处理程序中,您不使用pthreads或任何非异步信号安全函数.概述的解决方案不处理信号处理程序中的信号--在sigwaitinfo()返回后,它处理信号处理线程的正常执行流程中的信号。这使得它能够访问非异步信号安全函数,这就是关键所在。

票数 9
EN

Stack Overflow用户

发布于 2011-06-03 05:31:13

请记住,建议是在进程执行的早期,在生成任何线程或接收任何信号之前阻止信号(使用pthread_sigmask())。

回答你的问题:

  1. 阅读西格韦() (和/或西格)的手册页。当内核想要向进程发送信号但所有线程都阻塞了信号时,信号就会被“排队”。它一直在排队,直到(a)某个线程解除阻塞信号;或(b)一些线程调用信号上的σcalls ()或σthe ()。这里的建议是用一条线索来做后者。
  2. 这样做的想法是,您从不运行任何信号处理程序,因为没有任何线程会解除对信号的阻塞。相反,一个线程使用σ等待()等待信号,然后它处理该信号。这一切都发生在信号处理上下文之外,这是提案的美妙之处。
票数 4
EN

Stack Overflow用户

发布于 2014-08-12 05:58:28

您可以使用另一种机制间接地从信号处理程序调用pthread。在主线程中,创建一个侦听某些命令的Unix域套接字。信号处理程序可以有连接到套接字的代码,并向主线程发送命令,以调用您希望调用的pthread。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6223191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档