zoukankan      html  css  js  c++  java
  • 可重入与线程安全

    一、引言

    今天看网易公开课,孟宁老师的软件工程(C编码实践篇),讲到可重入和线程安全,结合他的讲解和我的理解,写下这篇博文,记录一下。

    二、可重入与线程安全的关系

    • 可重入不一定是线程安全的
    • 线程安全的一定是可重入的
    • 不可重入函数一定不是线程安全的

    孟老师最后的总结很不错:线程安全是扩大了范围的可重入,即可重入函数是指的单个函数,而线程安全则是真的代码块的可重入。

    三、我的理解

    可重入是针对一个函数的,可重入的函数是指,对与它操作的每一个变量都是它自己独占的(或者只操作局部变量,或者以锁机制来实现对共享变量的互斥访问),

    而线程安全,是指,一段代码(可能包含多个函数)对变量的访问是它自己独占的(或者只使用局部变量,或者以锁机制来实现对共享变量的互斥访问)。

    可重入的函数不一定是线程安全的,那么什么情况下可重入的函数不是线程安全的呢?下面这个例子就展示了这种情况:

    pthread_mutex_t g_plus;
    pthread_mutex_t g_minus;
    
    int g_nCount = 0;
    
    void Plus()
    {
        pthread_mutex_lock(&g_plus);
        g_nCount++;
        pthread_mutex_unlock(&g_plus);
    }
    
    void Minus()
    {
        pthread_mutex_lock(&g_minus);
        g_nCount++;
        pthread_mutex_unlock(&g_minus);
    }

    上面这段代码中,plus和minus都是可重入的函数,但是这段代码却不是线程安全的。如果要让它是线程安全的,那么对于全局变量g_nCount的操作使用一把锁即可。

    线程安全的代码:

    pthread_mutex_t g_mutexCount;
    
    int g_nCount = 0;
    
    void Plus()
    {
        pthread_mutex_lock(&g_mutexCount);
        g_nCount++;
        pthread_mutex_unlock(&g_mutexCount);
    }
    
    void Minus()
    {
        pthread_mutex_lock(&g_mutexCount);
        g_nCount++;
        pthread_mutex_unlock(&g_mutexCount);
    }

    这样这段代码块就是线程安全的了,因为对于全局变量g_nCount的访问使用的同一把锁。

  • 相关阅读:
    分享一个安装PE到硬盘的软件
    [转]盘点谷歌旗下的那些逆天机器人(视频)
    ubuntu安装google 输入法
    Beyond Compare 3.3.8 build 16340 + Key
    don't panic !
    Python3 list sort排序
    《操作系统、预防进程死锁的银行家算法》
    《操作系统_时间片轮转RR进程调度算法》
    《操作系统_FCFS和SJF》
    Hive初步使用、安装MySQL 、Hive配置MetaStore、配置Hive日志《二》
  • 原文地址:https://www.cnblogs.com/lit10050528/p/4457605.html
Copyright © 2011-2022 走看看