线程安全和可重入函数

来源:互联网 发布:mac系统电脑玩英雄联盟 编辑:程序博客网 时间:2024/05/29 19:17

        线程安全基于多线程程序(多执行流),单线程程序几乎不存在线程安全问题。

        简单来说,在运行环境一致的情况下,多次运行同一个多线程程序时,所有线程结果和单线程运行得到的结果一致时,则可以说该程序的线程是安全的。反之,则为线程不安全。

  引起线程安全问题的原因:

       通常都是由全局变量及静态变量的。

       若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

  避免线程不安全的方法:

      当程序代码是多线程访问时,通常采用了加锁机制来保证线程安全。

      一个类要成为线程安全的,在被多个线程访问时,只有在所有线程看来,对于线程安全对象的操作是以固定的、全局一致的顺序发生的。才能保证线程安全。必须办证不同线程所执行的对象操作是有先后顺序的而不是并行执行的。

       故我认为,可以简单的把引起线程安全问题的全局变量及静态变量看做临界资源,利用加锁机制,达到同一时刻只允许一个线程访问,以此来保证线程安全。

  

       而对于可重入函数,首先需要明确的是可重入函数主要用于多任务环境中,可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。

  函数不可重入的可能条件:

      1>调用了malloc或free,因为malloc也是用全局链表来管理堆的。

      2>调用了标准I/O库函数。因为标准I/O库的很多实现都以不可重入的方式使用全局数据结构。

        故显而易见的,几乎所有的数据结构的代码都属于不可重入的。

       而两个不同的控制流程调⽤同⼀个函数,访问它的同一个局 部变量或参数就不会造成错乱,是因为每个执行流都会建立自己的栈桢,彼此访问的都是自己的栈桢,就不会相互干扰而导致程序结果出错。

      分享如上,如有问题,望斧正!

PS:如想了解详细情况,可以自行百度哦。博主略懒,不想写的太繁琐。