百科定义为:
可重入函数主要用于多任务环境中,一个可重入的函数简单的说就是可以被终端的函数,也就是说,可以在这个函数执行的过程中的任何时刻中断它,转入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赋值,并计算其平方的过程中,本进程必须要等待其释放信号后,才能继续执行。
保证函数的可重入性的方法:在写函数时进可能使用局部变量,对于要使用的全局变量,要加以保护(如采取关中
断、信号量),这样构成的函数就一定是
一个可重入的函数。
总结:可重入就是可被打断,不可重入就是不可被打断。