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

    1 定义

    (1)线程安全:多个线程同时运行一段代码,不会造成资源的冲突,不会产生错误的结果,那么这段代码是线程安全的。

    (2)可重入:多个执行流反复执行一段代码,其结果不会发生改变。

    2 条件

    (1)常见线程安全满足的条件:

    • 只读全局变量或静态变量
    • 保护共享资源
    • 调用线程安全的函数

    2)常见可重入函数满足的条件:

    • 只读全局变量或静态变量
    • 不操作共享资源
    • 不调用不可重入函数
    • 不调用malloc/free函数
    • 不调用标准I/O函数

    3 区别

    可重入的函数必定是线程安全的,而线程安全的函数不一定是可重入的,其关系如下图所示:

    那么要理解这两者的区别,就在于举出一些“可重入但不是线程安全”的例子,仅仅是通过文字定义的描述很容易混淆。从定义上看,线程安全是多线程同时执行同一个函数,而可重入则是多个执行流,这是理解其区别的重点。例如有以下代码:

    pthread_mutex_t mut;

    int function()

    {

    pthread_mutex_lock(&mut);

    ...   //执行流

    pthread_mutex_unlock(&mut);

    }

    这个函数中加入了互斥锁的保护机制,可见是可以被多个线程同时调用的,是线程安全的。但是如果程序执行到执行流中时,此时产生了中断,OS转向中断函数中,而在中断函数中又调用了此函数,那么就会产生死锁,由此看来,此函数是不可重入的。

  • 相关阅读:
    C# 访问AD查询用户信息
    js UTC时间转本地时间
    Silverlight中的序列化和反序列化
    ASP.NET FORM认证配置排错记录
    opencv中cvSetData用法
    WS2812B-64位 8*8位 RGB LED点阵
    1602 LCDKeypad Shield
    Wemos D1 使用ESP8266 板载存储
    Wemos D1 ESP8266的网络工作模式
    Wemos D1 1602 液晶屏幕
  • 原文地址:https://www.cnblogs.com/fangyan5218/p/10618332.html
Copyright © 2011-2022 走看看