分类: C/C++
2008-10-21 19:54:02
若一个或可以安全的被执行,则称其为可重入(reentrant或re-entrant)的;即,当该子程序正在运行时,可以再次进入并执行它。若一个函数是可重入的,则该函数:
多'用户/对象/进程'以及一般会使得对可重入代码的控制变得复杂。同时,IO代码通常不是可重入的,因为他们依赖于像磁盘这样共享的、单独的资源。
可重入性是的关键特性之一。
例子
在以下的代码中,函数f
和函数g
都不是可重入的。
int g_var = 1; int f() { g_var = g_var + 2; return g_var; } int g() { return f() + 2; }
以上代码中,f
使用了 g_var,所以,如果两个线程同时执行它并访问g_var
,则返回的结果取决于执行的时间。因此,f
不可重入。而g
调用了f
,所以它也不可重入。
稍作修改后,两个函数都是可重入的:
int f(int i) { return i + 2; } int g(int i) { return f(i) + 2; }
可重入与两个概念都关系到函数处理资源的方式。但是,他们有一定的区别。可重入概念会影响函数的外部接口,而线程安全只关心函数的实现。
因此,相对来说,可重入性是更基本的特性,它可以保证:即,所有的可重入函数都是线程安全的,但并非所有的线程安全函数都是可重入的。