不可重入函數是那種不能被并行調用的函數,"重入"的意思就是指的同時有兩個以上的地方進入了函數內部, 這是因為這種函數的實現包含了靜態的數據結構等, 當"重入"現象發生時, 導致這些數據結構錯亂.
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函數淺析使用可重入函數進行更安全的信號處理