Maj*_*imi 12 c multithreading signals pthreads
Linux编程接口手册提到了一种在多线程程序中处理异步信号的方法:
- 所有线程都阻止进程可能接收的所有异步信号.最简单的方法是在创建任何其他线程之前阻止主线程中的信号.随后创建的每个线程都将继承主线程信号掩码的副本.
- 创建,使用接受传入信号的单个专用线程
sigwaitinfo(),sigtimedwait()或sigwait().这种方法的优点是同步接收异步生成的信号.由于它接受传入信号,专用线程可以安全地修改共享变量(在互斥控制下)并调用非异步安全功能.它还可以发信号通知条件变量,并且可以实现其他线程和进程通信和同步机制.
现在的问题是:
当内核提供过程导向信号时,它会选择其中一个没有阻塞信号的线程.这意味着它永远不会选择除信号处理线程之外的任何线程(其行为类似于信号在被阻塞sigwaitinfo()或类似时被解除阻塞).换句话说:内核知道在哪里传递信号,因为你已经安排了一些事情,使得信号处理线程是唯一允许传递信号的线程.
您不在信号处理程序中使用pthreads API或任何非异步信号安全函数.概述的解决方案不处理信号处理程序内的信号 - 它在sigwaitinfo()返回后处理信号处理线程的正常执行流程内的信号.这允许它访问非异步信号安全功能,这是重点.