13

根据 APUE 2e 第 12.5 章:

如果一个函数对于多个线程是可重入的,我们就说它是线程安全的。然而,这并不能告诉我们函数对于信号处理程序是否是可重入的。我们说可以安全地从异步信号处理程序重新进入的函数是异步信号安全的。

我的问题是

Q1:

是否有“一般重入”概念(这意味着在所有情况下都可以重入)?如果有,一般重入是否等于仅对多线程和异步信号的重入?还是在谈论一般重入时还必须考虑第三个条件?

Q2:

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

问题 3:

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

4

1 回答 1

12

Q1:异步信号安全是重入的最强概念。它需要非常小心地使用资源,并且在跨平台的应用程序代码中难以管理。

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

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

于 2013-04-12T23:22:36.760 回答