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

    线程安全与可重入编写方法。

    1、什么是线程安全
    当一个函数被多个线程反复调用的时候,他会一直产生正确的结果,那么这个函数就是线程安全的。线程安全函数解决了多个线程调用函数时访问临界资源的冲突问题。

    2、可重入
    在多线程或有异常控制流的情况下,当某个函数运行到中途时,控制流有可能被打断去执行另一个函数,而这”另一个函数”有可能是他本身,如果在这种情况下不会出现问题,比如与说数据或状态不被破坏,而且行为可预期,那么这个函数就被称为可重入的。反之,就是不可重入函数 。
    简单来说就是:当一个函数被多个线程调用的时候,不会引用任何共享数据,那么这个函数就是可重入的。可重入函数可以在任意时刻被中断,稍后再继续运行,也不会丢失数据。反之就是不可重入。

    3、线程安全与可重入的区别于联系
    线程安全的根源就在于”共享数据”。所以不共享任何数据的函数(可重入函数)肯定是线程安全的。但是,即使有共享数据,线程安全还可以通过同步与互斥来保证,所以线程安全并不一定是可重入的。

    关系如图:

    可重入是线程安全的一个真子集,可重入一定线程安全,但线程安全不一定可重入。

    4、怎样编写可重入函数
    关于线程安全,我们可以通过同步与互斥来实现,下面介绍一下编写可重入函数时的规范:
    1、不能在函数内部使用静态或全局数据
    2、不能返回静态或全局数据,所有数据都有函数的调用者提供
    3、使用本地数据、或通过制作全局数据的本地拷贝来保护全局数据。
    4、如果必须访问全局变量,利用互斥机制来保护全局变量。
    5、不在可重入函数内部调用不可重入函数。、
    6、不调用malloc和free函数,因为malloc是用全局链表来管理堆的。
    7、不调用了标准I/O函数。标准I/O函数很多都以不可重入的方式实现全局数据结构。

    最常见的就是在信号处理函数中不能使用不可重入函数。如果在信号处理函数中使用了不可重入函数,则可能导致程序出现错误甚至崩溃。

  • 相关阅读:
    [HDOJ1827]Summer Holiday(强连通分量,缩点)
    [CF676C]Vasya and String(尺取法,原题)
    [51NOD1105]第k大的数(二分答案)
    [51NOD]BSG白山极客挑战赛
    [HDOJ4635]Strongly connected(强连通分量,缩点)
    Miller_Rabin(米勒拉宾)素数测试算法
    hdu 3501 Calculation 2 欧拉函数
    codeforces 350 div2 D Magic Powder
    codeforces 350 div2 C. Cinema map标记
    hdu 2824 The Euler function 欧拉函数打表
  • 原文地址:https://www.cnblogs.com/rinack/p/9067229.html
Copyright © 2011-2022 走看看