概要
可重入函数,顾名思义,就是多次调用,执行的结果是一致的。
在单任务或单线程且没有中断的系统中,程序是顺序执行的,就不存在可重入性的问题。
而在多任务或多线程的系统中,多任务可以同时调用同一函数,即正在执行的函数可能被打断,
如果能够保证打断后,继续执行的结果与未被打断执行的结果保持一致,函数即具有可重入性;
相反,函数不具有可重入性。
可重入函数例子
void strcpy(char *lpszDest, char *lpszSrc) {
while(*lpszDest++=*lpszSrc++);
*dest=0;
}
特点
- 函数中使用了静态数据或全局数据
例1:
void SwapChar2(char *lpcX,char *lpcY) {
static char cTemp;//静态局部变量
cTemp=*lpcX;
*lpcX=*lpcY;
lpcY=cTemp;//使用了静态局部变量
}
例2:
char cTemp;//全局变量
void SwapChar1(char *lpcX, char *lpcY) {
cTemp=*lpcX;
*lpcX=*lpcY;
lpcY=cTemp;//访问了全局变量
}
函数中使用了malloc()或者free()函数
malloc/free是不可重入的,它们使用全局变量来只向空闲区函数内使用了标准的I/O函数
标准I/O函数中,很多使用了全局变量进行了浮点运算
许多的处理器/编译器,浮点运算都是不可重入的
如何预防
在函数内不使用静态变量或全局变量,坚持只使用静态变量,如果必须访问全局变量,需要利用信号量的进行保护。
在函数内不使用任何不可重入的函数。