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

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

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

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

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

    关系如图:

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

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

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

  • 相关阅读:
    1063. Set Similarity
    A1047. Student List for Course
    A1039. Course List for Student
    最大公约数、素数、分数运算、超长整数计算总结
    A1024. Palindromic Number
    A1023. Have Fun with Numbers
    A1059. Prime Factors
    A1096. Consecutive Factors
    A1078. Hashing
    A1015. Reversible Primes
  • 原文地址:https://www.cnblogs.com/rinack/p/9067229.html
Copyright © 2011-2022 走看看