在中,对可重入与线程安全的概念与实现进行了详细的描述。由于这两个概念常常会令学习者困惑并混淆,这里就再对这个话题做个总结,希望能够简单明了的阐述清楚它们之间的区别与联系。
首先来引用一段:
线程安全的函数可以被多个线程同时调用,即便调用者使用了共享数据,这是因为所有对该共享数据的引用都是序列化的;
可重入的函数也可以被多个线程同时调用,但是需要调用者使用自己独有的数据;
因此,线程安全的函数总是可重入的,但可重入的函数并不总是线程安全的。
综合起来,我们可以简单总结如下:
可重入函数的侧重点在于强调数据的独有性,这一点也可以从“将非可重入函数改造为可重入函数需要改变接口”看出,这么做的目的就是为了让调用者提供独有的数据块;
可重入函数在使用场景上强调“相继(successive call)”而不是“同时(simultaneously)“,而线程安全函数则是强调“同时”;
非可重入函数无法变为线程安全的:
mutex_locknon_reentrantmutex_unlock
如上面的代码所示,在强调“相继”的场景下,线程锁并不能够保护非可重入代码段中的静态数据;
4. 在异步信号的情况下,不能使用非可重入/非线程安全的函数;