可重入函数与不可重入函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可重入函数与不可重入函数相关的知识,希望对你有一定的参考价值。
参考技术A满足下面条件之一的多数是不可重入函数:
(1)使用了静态数据结构或者全局变量;
(2)调用了malloc或free;
(3)调用了标准I/O函数;标准io库很多实现都以不可重入的方式使用全局数据结构。
(4)进行了浮点运算.许多的处理器/编译器中,浮点一般都是不可重入的 (浮点运算大多使用协处理器或者软件模拟来实现。
(5)调用printf。
在多任务环境中或者实时系统设计中,应该尽可能的使用可重入函数,例如下面的函数:
该函数功能是计算不同篮子里的苹果数,函数体内没有访问全局变量,不使用静态局部变量,只使用局部变量,所以这个函数具有可重入的,如果必须使用全局变量,那么为了保证函数的安全,必须利用互斥信号量或者中断机制来保护全局变量。例如下面函数:
象上面的PV操作机制就可以让可重入函数安全的使用全局变量了,而且保证了可并行性。
不可重入函数,例如:
这个函数由于使用了静态全局变量,对sum的并行性操作结果是未知的,是不安全的操做。若此函数被多个进程调用的话,结果是未知的。因为,但语句(1)执行完一次或者几次后,另外使用这个sum的函数可能正好被调度,并得到运行机会,那么这个新运行的函数将使sum变成了另外的值,所以当(1)重新获得运行机会时,sum的值已经变成了另外的值,这是不可预料的结果。
也可以这样总结, 在多任务系统中要进行并行操作,应该保证函数的可重入性(),或者使用信号量、中断等机制来保证数据的安全性操作。
可重入函数
一个函数在被调用执行期间(尚未调用结束),由于某种时序又被重复调用,称之为“重入”。根据函数实现的方法可分为“可重入函数”和“不可重入函数”两种。
注意事项
- 定义可重入函数,函数内不能含有全局变量及static变量,不能使用malloc、free
- 信号捕捉函数应设计为可重入函数
- 信号处理程序可以调用的可重入函数可参阅man 7 signal
- 没有包含在上述列表中的函数大多是不可重入的,其原因为:
a) 使用静态数据结构
b) 调用了malloc或free
c) 是标准I/O函数
以上是关于可重入函数与不可重入函数的主要内容,如果未能解决你的问题,请参考以下文章