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

Maj*_*imi 12 c multithreading signals pthreads

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

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

这种方法的优点是同步接收异步生成的信号.由于它接受传入信号,专用线程可以安全地修改共享变量(在互斥控制下)并调用非异步安全功能.它还可以发信号通知条件变量,并且可以实现其他线程和进程通信和同步机制.

现在的问题是:

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

caf*_*caf 8

当内核提供过程导向信号时,它会选择其中一个没有阻塞信号的线程.这意味着它永远不会选择除信号处理线程之外的任何线程(其行为类似于信号在被阻塞sigwaitinfo()或类似时被解除阻塞).换句话说:内核知道在哪里传递信号,因为你已经安排了一些事情,使得信号处理线程是唯一允许传递信号的线程.

不在信号处理程序中使用pthreads API或任何非异步信号安全函数.概述的解决方案不处理信号处理程序内的信号 - 它在sigwaitinfo()返回后处理信号处理线程的正常执行流程内的信号.这允许它访问非异步信号安全功能,这是重点.