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

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函数浅析
使用可重入函数进行更安全的信号处理


你可能感兴趣的:(APUE2读书笔记(三):不可重入函数)