那谁的技术博客

感兴趣领域:高性能服务器编程,存储,算法,Linux内核
随笔 - 210, 文章 - 0, 评论 - 1183, 引用 - 0
数据加载中……

APUE2读书笔记(三):不可重入函数

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

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 那谁 阅读(2561) 评论(0)  编辑 收藏 引用 所属分类: Linux/Unix读书笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理