不可/可重入函数

    百科定义为:

 可重入函数主要用于多任务环境中,一个可重入的函数简单的说就是可以被终端的函数,也就是说,可以在这个函数执行的过程中的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入函数由于使用了一些系统资源,如全局变量,中断向量表等,所以它如果被终端的化,可能会出现问题,这类函数是不能运行在多任务环境下的

可重入函数也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),

这样的函数就是purecode(纯代码)可重入,可以允许有多个该函数的副本在运行,由于他们使用的是分离

的栈,所以不会互相干扰,如果确实需要访问全局变量,包括static,一定要注意实施互斥手段,可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。

举例:假设Exam为int型全局变量,函数square是求平方根函数,那么下面的函数就不具有可重入性。

unsigned int example( int para )
{
unsigned int temp;
Exam = para; // (**)
temp = Square_Exam( );
return temp;
}

为什么呢?假设该函数被多个进程调用,其结果可能是未知的,因为当(**)语句刚执行完后,另外一个使用本函数的进程可能刚好被激活,也就是这个函数正执行过程中被

中断了,这个很正常,因为OS就是会调度,新的任务可能会使exam赋值一个新的值,所以当控制重新返回时,

square计算的值可能就不是预想的结果了,所以这个函数应做如下改进:

unsigned int example( int para )
{
unsigned int temp;
[申请信号量操作] //(1)
Exam = para;
temp = Square_Exam( );
[释放信号量操作]
return temp;
}
这里,如果申请不到“信号量”,说明另外的进程正处于给exam赋值,并计算其平方的过程中,本进程必须要等待其释放信号后,才能继续执行。


保证函数的可重入性的方法:在写函数时进可能使用局部变量,对于要使用的全局变量,要加以保护
(如采取关中

断、信号量),这样构成的函数就一定是

一个可重入的函数。

 总结:可重入就是可被打断,不可重入就是不可被打断。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值