zoukankan      html  css  js  c++  java
  • 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,不懂,解释得不够详细阿

  • 相关阅读:
    oracle12 安装
    ORACLE重装之后恢复数据库,相当于sqlserver的附加数据库
    git
    P1323 删数游戏(技巧)
    P2486 【SDOI2011】 染色
    P1084 【NOIP 2012】 疫情控制
    前缀、中缀、后缀表达式
    【P1979】 NOIP2013 华容道
    P2601 【ZJOI2009】对称的正方形
    NOIP2015 运输计划
  • 原文地址:https://www.cnblogs.com/mightofcode/p/2857750.html
Copyright © 2011-2022 走看看