可重入函数未必是线程安全的,线程安全函数也未必是可重入的。
线程安全
线程安全指某个函数、函数库在多线程环境中被调用时,能够正确处理多个线程之间的共享变量,使程序功能正确完成。
可重入
若一个程序或子程序可以“在任意时刻被中断然后操作系统调试执行另外一段代码,这段代码又调用了该子程序不会出错”,则称其为可重入的。即当该子程序正在运行时,执行线程可以再次进入并执行它,仍然获得符合设计时的预期的结果。与多线程并发执行的线程安全不同,可重入强调的是对单个线程执行时重新进入同一个子程序仍然是安全的。
若一个函数是可重入的,则该函数应当满足下述条件:
- 不能含有静态(全局)非常量数据。
- 不能返回静态(全局)非常量数据的地址。
- 只能处理由调用者提供的数据。
- 不能依赖于单实例模式资源的锁。
- 调用的函数也必须是可重入的。