什么构成异步安全

Met*_*est 14 c linux synchronization asynchronous signal-handling

据说你应该只在信号处理程序中调用异步安全函数.我的问题是,什么构成异步安全?我认为一个可重入线程安全的函数是异步安全的吗?或没有?

小智 12

重新进入和螺纹安全与此有点或无关.这些功能的副作用,状态和中断是重要的事实.

异步安全函数 [GNU Pth]

如果函数可以安全地调用并且没有信号处理程序上下文中的副作用,则该函数是异步安全的或异步信号安全的.也就是说,它必须能够在任何点被中断以线性地不按顺序运行而不会导致不一致的状态.当全局数据本身可能处于不一致状态时,它也必须正常运行.此处列出了一些异步安全操作:

  • 调用该signal()函数重新安装信号处理程序
  • 无条件地修改volatile sig_atomic_t变量(因为对此类型的修改是原子的)
  • 调用该_Exit()函数立即终止程序执行
  • 调用异步安全函数,由您的实现指定

很少有功能可以安全地进行异步安全.如果函数执行任何其他操作,则可能不是可移植的异步安全.

一个经验法则是 - 仅从信号处理程序中发出一些条件变量(例如futex/pthread条件,唤醒epoll循环等).

更新:

正如EmployedRussian所说,即使打电话pthread_cond_signal也是个坏主意.我检查了最近的源代码,eglibc它有锁定/解锁对.因此,引入了死锁的可能性.这使我们几乎没有选择信号通知其他线程:

  1. eventfd.
  2. 更改全局原子变量并希望未设置SA_RESTART,其他线程将检查我们的原子.

  • 有一个更大的函数列表[保证由POSIX.1-2008保持异步信号安全](http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03)(你将不得不向下滚动一下列表),包括大多数传统的Unix"系统调用",并访问`errno`.此外,如果您知道只有在[`sigsuspend`](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigsuspend.html)上阻止正常执行时才会调用您的信号处理程序,那么它是安全的在处理程序中执行任意操作. (5认同)