apue读书笔记-第十二章

1 可重入,线程安全,异步信号安全之间的区别?

   可重入:可以重复进入,不会引起问题(这个概念最宽)

   线程安全:被多个线程使用时,不会出问题,也就是可以被多个进程重入(新函数和被终端和被中断的函数不在同一线程)

   异步信号安全:可以被信号函数重入(信号处理函数和被中断的函数在同一线程)

   可重入必然线程安全,必然异步信号安全

   线程安全与异步信号没有关系

   举个例子,一个函数使用了全局变量,那么它是不可重入的,但是如果给它加上锁(),那么它就是线程安全的,但是不是异步信号安全的,因为此时会死锁

   那么如何让它成为异步信号安全的呢?在函数开头阻塞所有信号,结尾解除阻塞,那么它就是异步信号安全的了,当然,它锁

 死锁的例子:

   

#include"../apue.h"



pthread_mutex_t mut;
void sig_usr1(int n)
{
    printf("%s\n","usr1");
    pthread_mutex_lock(&mut);
    pthread_mutex_unlock(&mut);
    printf("%s\n","usr1 end");
    return ;
}

int waga()
{
static int n1=0;
    pthread_mutex_lock(&mut);
    printf("%s\n","lock");
    if(n1==0)raise(SIGUSR1);
    n1++;
    sleep(1);
    pthread_mutex_unlock(&mut);
    printf("%s\n","unlock");
}
int main()
{
    pthread_mutexattr_t attrt;
    pthread_mutexattr_init(&attrt);
    pthread_mutexattr_setpshared(&attrt,PTHREAD_MUTEX_NORMAL);    
    pthread_mutex_init(&mut,&attrt);
     
    signal(SIGUSR1,sig_usr1);
    waga();    
}

 

2,取消点有什么用?

   线程并不会立即响应cancel请求,而是在取消点响应

3,多线程的fork怎么处理?

     父线程获取锁——fork——父线程释放,子线程释放

    多线程fork会引起很多问题,这里有一些讨论http://blog.codingnow.com/2011/01/fork_multi_thread.html

习题1,fork复制了标准io库缓冲区,所以会看到重复的输出

习题3,可以,而且要保证调用的函数同样是异步信号安全的

习题7,不懂,解释得不够详细阿

posted @ 2013-01-13 13:11  mightofcode  阅读(174)  评论(0编辑  收藏  举报