什么构成asynchronous安全

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

Solutions Collecting From Web of "什么构成asynchronous安全"

重新进入和线程安全与此有一点关系或没有关系。 这些功能的副作用,状态和中断是重要的事实。

异步安全功能 [GNU Pth]

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

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

很少的函数是可移植的异步安全的。 如果一个函数执行任何其他的操作,它可能不是可移植的异步安全的。

一个经验法则是这个 – 只能从信号处理器发出一些条件变量(如futex / pthread条件,唤醒epoll循环等)。

更新:

按照俄罗斯人的建议,即使调用pthread_cond_signal也是一个坏主意。 我已经检查了最近的eglibc的源代码,并在那里有锁/解锁对。 因此,引入了一个僵局的可能性。 这给我们留下了很少的选项来指示其他线程:

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

对于你自己的代码,是的,重入和线程安全是你需要的特性,因为根据你如何设置你的信号处理机制,你的信号处理器本身可能会被另一个信号中断。 一般来说,尽量在信号处理程序中尽可能少地做些工作。 设置标志触发正常程序流程中的特殊代码可能是你应该做的。

对于您可能调用的操作系统中的函数,请查看man 7 signal以获取可以安全调用的列表。 请注意, malloc()free() 不在列表中。 pthread同步API也不在列表中,但是我认为有些必须是安全的,所以你可以在一个信号处理程序中安全地设置一个全局标志。