不可重入函數(shù)是那種不能被并行調(diào)用的函數(shù),"重入"的意思就是指的同時(shí)有兩個(gè)以上的地方進(jìn)入了函數(shù)內(nèi)部, 這是因?yàn)檫@種函數(shù)的實(shí)現(xiàn)包含了靜態(tài)的數(shù)據(jù)結(jié)構(gòu)等, 當(dāng)"重入"現(xiàn)象發(fā)生時(shí), 導(dǎo)致這些數(shù)據(jù)結(jié)構(gòu)錯(cuò)亂.
malloc是一個(gè)不可重入函數(shù), 這里給出一個(gè)以"重入"方式對之進(jìn)行調(diào)用的例子以解釋"不可重入"這個(gè)概念:
#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;
}
定義一個(gè)每微秒觸發(fā)的定時(shí)器, 觸發(fā)時(shí)產(chǎn)生alarm信號, 在信號處理函數(shù)中調(diào)用malloc/free, 程序的主循環(huán)也調(diào)用malloc/free,馬上程序就停住了,strace看了一下進(jìn)程, 死鎖了.
也就是說,所謂的"不可重入函數(shù)"指的就是不能在兩個(gè)或以上的地方(在這個(gè)例子中是程序主循環(huán)和信號處理函數(shù))同時(shí)調(diào)用的函數(shù).
同時(shí), 如果沒有這種在多個(gè)地方同時(shí)會并行調(diào)用不可重入函數(shù)的情況, 那么調(diào)用不可重入函數(shù)也是安全的.
相關(guān)帖子:
[原創(chuàng)]reentrant函數(shù)與thread safe函數(shù)淺析使用可重入函數(shù)進(jìn)行更安全的信號處理