Linux编程接口书提到了一种在多线程程序中处理异步信号的方法:
sigwaitinfo()、sigtimedwait()或sigwait()接收传入信号的专用线程。这种方法的优点是同步接收异步产生的信号。由于接受传入信号,专用线程可以安全地修改共享变量(在互斥控制下)并调用非异步安全函数。它还可以对条件变量进行信号处理,还可以对其他线程和进程进行通信和同步。
现在的问题是:
发布于 2011-06-03 05:32:01
当内核传递一个进程导向的信号时,它会选择一个没有阻止信号的线程。这意味着,除了信号处理线程之外,它从来不选择任何线程(在sigwaitinfo()或类似的线程中阻止信号时,它的作用就像解除信号阻塞一样)。换句话说:内核知道在哪里传递信号,因为您已经安排了一些事情,使得信号处理线程是唯一允许将信号传递给的线程。
在信号处理程序中,您不使用pthreads或任何非异步信号安全函数.概述的解决方案不处理信号处理程序中的信号--在sigwaitinfo()返回后,它处理信号处理线程的正常执行流程中的信号。这使得它能够访问非异步信号安全函数,这就是关键所在。
发布于 2011-06-03 05:31:13
请记住,建议是在进程执行的早期,在生成任何线程或接收任何信号之前阻止信号(使用pthread_sigmask())。
回答你的问题:
发布于 2014-08-12 05:58:28
您可以使用另一种机制间接地从信号处理程序调用pthread。在主线程中,创建一个侦听某些命令的Unix域套接字。信号处理程序可以有连接到套接字的代码,并向主线程发送命令,以调用您希望调用的pthread。
https://stackoverflow.com/questions/6223191
复制相似问题