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,不懂,解释得不够详细阿

  • 相关阅读:
    按钮一色三变化
    最小的k个数-Python版
    字符串的全排列-终于弄明白了
    键值offer-求逆序对
    Python小技巧
    面试题48-动态规划-最长不含重复字符的子字符串,剪绳子
    面试题47-礼物的最大价值(Python版)
    多元高斯分布
    torch_13_ProGan笔记
    pytorch-模型保存与加载自己训练的模型详解 
  • 原文地址:https://www.cnblogs.com/mightofcode/p/2857750.html
Copyright © 2011-2022 走看看