重入函数

如果一个函数在执行过程中被中断,为中断服务程序提供服务,然后在不妨碍其早期操作过程的情况下恢复先前进行的函数,则称该函数为可重入函数。可重入函数用于硬件中断处理、递归等应用。 函数必须满足某些条件才能被称为可重入函数: 1.它可能不使用全局和静态数据。虽然没有限制,但一般不建议这样做。因为中断可能会改变某些全局值,用新数据恢复可重入函数的操作过程可能会产生不希望的结果。 2.它不应该修改自己的代码。这一点很重要,因为函数的操作过程在整个代码中应该保持不变。但是,如果中断例程每次使用不同的值或在中断前后都使用可重入函数的本地副本,则这是允许的。 3.不应调用另一个不可重入函数。

null

线程安全和可重入函数 可重入性不同于线程安全,但与线程安全密切相关。函数可以是线程安全的,但仍然不可重入。例如,一个函数可以用一个互斥锁(这可以避免多线程环境中的问题)来包装,但如果在中断服务例程中使用该函数,它可能会在等待第一次执行释放互斥锁时饿死。避免混淆的关键是可重入仅指一个正在执行的线程。这是一个从没有多任务操作系统的时代开始的概念。(来源: https://en.wikipedia.org/wiki/Reentrancy_(计算机) )

不可重入函数的示例:

// A non-reentrant example
// [The function depends on global variable i]
int i;
// Both fun1() and fun2() are not reentrant
// fun1() is NOT reentrant because it uses global variable i
int fun1()
{
return i * 5;
}
// fun2() is NOT reentrant because it calls a non-reentrant
// function
int fun2()
{
return fun1() * 5;
}


可重入函数示例: 在下面的代码中,fun2是一个可重入函数。如果一个中断暂停了它的执行并将控制转移到fun1。fun1完成后,控制再次转移到fun2,并重新进入执行阶段。

// Both fun1() and fun2() are reentrant
int fun1( int i)
{
return i * 5;
}
int fun2( int i)
{
return fun1(i) * 5;
}


文章由 文基 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享