线程安全和异步信号安全之间的区别

时间:2012-03-23 10:10:15

标签: unix asynchronous thread-safety signals reentrancy

根据APUE 2e第12.5章:

  

如果函数对于多个线程是可重入的,我们说它是线程安全的。但是,这并没有告诉我们该函数是否可以在信号处理程序中重入。我们说可以安全地从异步信号处理程序重新输入的函数是异步信号安全的。

我的问题是

Q1:

是否存在“一般可重入”概念(这意味着在所有情况下都可以重新进入)?如果有的话,一般的重入是否仅相当于多线程和异步信号的重入?或者在谈论一般重入时还需要考虑第三个条件吗?

Q2:

线程安全并不意味着异步信号安全,这是显而易见的。但是,异步信号安全是否意味着线程安全?我搜索了很多,人们说它确实如此,但我找不到它的任何来源。

Q3:

如果Q1和Q2的答案都是肯定的,我猜一般的重入是否等于异步信号安全?

1 个答案:

答案 0 :(得分:7)

Q1:async-signal safe是最强的重入概念。它需要非常小心地使用资源,并且难以在跨平台应用程序代码中进行管理。

Q2:异步信号安全意味着线程安全。线程安全意味着尝试两次调用函数是可以的,但是来自不同的线程; async-signal safe更强,因为函数的两次调用可以在同一个线程中。这使得事情变得更加困难,因为您不能简单地等待函数的其他调用来释放其锁,即使共享资源处于不一致状态,信号处理程序内的第二个调用也必须能够中断第一个调用。 ,然后在退出时恢复。从信号处理程序使用共享资源/状态基本上是不可能的:除非你真的知道信号处理程序是如何工作的,并且有一些模糊的理由来编写疯狂的代码,否则总是使用“自管技巧”。

问题3:有些人可能会使用可重入来表示线程安全。 Unix信号处理程序是唯一需要更强大功能的常见地方,这有点模糊,因为你不应该在那里做任何聪明的事情。