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它有锁定/解锁对.因此,引入了死锁的可能性.这使我们几乎没有选择信号通知其他线程:
eventfd.