不可重入函数是那种不能被并行调用的函数,"重入"的意思就是指的同时有两个以上的地方进入了函数内部, 这是因为这种函数的实现包含了静态的数据结构等, 当"重入"现象发生时, 导致这些数据结构错乱.
malloc是一个不可重入函数, 这里给出一个以"重入"方式对之进行调用的例子以解释"不可重入"这个概念:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
int SetTimer()
{
struct itimerval interval;
interval.it_interval.tv_sec = 0;
interval.it_interval.tv_usec = 1;
interval.it_value.tv_sec = 1;
interval.it_value.tv_usec = 0;
if (::setitimer(ITIMER_REAL, &interval, NULL))
{
return -1;
}
return 0;
}
void Handler(int nSigNo)
{
printf("ALARM signal!\n");
char *p = (char*)malloc(rand() % 40960)
free(p);
}
int main()
{
SetTimer();
signal(SIGALRM, Handler);
while (1)
{
char *p = (char*)malloc(rand() % 40960);
free(p);
}
return 0;
}
定义一个每微秒触发的定时器, 触发时产生alarm信号, 在信号处理函数中调用malloc/free, 程序的主循环也调用malloc/free,马上程序就停住了,strace看了一下进程, 死锁了.
也就是说,所谓的"不可重入函数"指的就是不能在两个或以上的地方(在这个例子中是程序主循环和信号处理函数)同时调用的函数.
同时, 如果没有这种在多个地方同时会并行调用不可重入函数的情况, 那么调用不可重入函数也是安全的.
相关帖子:
[原创]reentrant函数与thread safe函数浅析使用可重入函数进行更安全的信号处理