说每个递归函数都需要是可重入的,这是一个真实的陈述吗?
答案 0 :(得分:3)
如果通过重入意味着你可以在前一个函数结束之前开始对该函数的进一步调用,那么是的,所有递归函数都恰好是可重入的,因为递归意味着在这种意义上的重入。
然而,“reentrant”有时被用作“线程安全”的同义词,这引入了许多其他要求,从这个意义上说,答案是否定的。在单线程递归中,我们有一个特殊情况,即一次只执行一个函数的“实例”,因为堆栈上的“空闲”实例都在等待它们的“子”实例返回。
答案 1 :(得分:1)
'Reentrant'通常意味着可以通过两个不同的线程同时输入该函数。
要重新进入,它必须执行诸如保护/锁定访问静态的操作。
递归函数(另一方面)不需要保护/锁定对静态的访问,因为它一次只执行一个语句。
所以:不。
答案 2 :(得分:0)
完全没有。
例如,为什么递归函数不能具有静态数据?它是否应该无法锁定关键部分?
考虑:
sem_t mutex;
int calls = 0;
int fib(int n)
{
down(mutex); // lock for critical section - not reentrant per def.
calls++; // global varible - not reentrant per def.
up(mutex);
if (n==1 || n==0)
return 1;
else
return fib(n-1) + fib(n-2);
}
这并不是说编写递归和可重入函数很容易,既不是常见模式,也不是以任何方式推荐。但这是有可能的。
答案 3 :(得分:0)
不,我记得一个与静态(全局)变量一起使用的阶乘函数。具有静态(全局)变量反对可重入,并且该函数仍然是递归的。
global i;
factorial()
{ if i == 0 return 1;
else { i = i -1; return i*factorial();
}
此函数是递归的,并且它是不可重入的。
答案 4 :(得分:0)
不完全是。可重入函数需要能够处理不同线程的并发执行。
递归函数必须能够在它仍在运行时处理条目,但访问是以受控方式完成的,而不是由其他线程完成的。