不可重入函数是那种不能被并行调用的函数,"重入"的意思就是指的同时有两个以上的地方进入了函数内部, 这是因为这种函数的实现包含了静态的数据结构等, 当"重入"现象发生时, 导致这些数据结构错乱.

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 *= (char*)malloc(rand() % 40960)
    free(p);
}

int main()
{
    SetTimer();

    signal(SIGALRM, Handler);

    
while (1)
    {
        
char *= (char*)malloc(rand() % 40960);
        free(p);
    }

    
return 0;
}


定义一个每微秒触发的定时器, 触发时产生alarm信号, 在信号处理函数中调用malloc/free, 程序的主循环也调用malloc/free,马上程序就停住了,strace看了一下进程, 死锁了.

也就是说,所谓的"不可重入函数"指的就是不能在两个或以上的地方(在这个例子中是程序主循环和信号处理函数)同时调用的函数.

同时, 如果没有这种在多个地方同时会并行调用不可重入函数的情况, 那么调用不可重入函数也是安全的.

相关帖子:
[原创]reentrant函数与thread safe函数浅析
使用可重入函数进行更安全的信号处理


posted on 2008-09-02 17:18 那谁 阅读(1343) 评论(0)  编辑 收藏 引用 所属分类: Linux/Unix读书笔记

标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航: