线程安全和可重入函数的区别与联系

线程安全:安全

    通常来讲,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其余线程不能进行访问直到该线程读取完,其余线程才可以使用。不会出现数据不一致或者数据污染。
多线程

若是你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。若是每次运行结果和 运行的结果是同样的,并且其余的变量的值也和预期的是同样  的, 就是线程安全的。并发

或者说:一个类或者程序所提供的接口对于线程来讲是原子操做或者多个线程之间的切换不会致使该接口的执行结果存在二义性,也就是说咱们不用考虑同步的问题。ide

线程安全问题都是由全局变量及静态变量引发的。函数

若每一个线程中对全局变量、静态变量只有读操做,而无写操做,通常来讲,这个全局变量是线程安全的;如有多个线程同时执行写操做,通常都须要考虑线程同步,不然的话就可能影响线程安全。spa

可重入函数:线程

可重入函数是线程安全函数的一种,其特色在于它们被多个线程调用时,不会引用任何共享数据。接口

可重入函数能够有多余一个任务并发使用,而没必要担忧数据错误,相反,不可重入函数不能由超过一个任务所共享,除非能确保函数的互斥进程

(或者使用信号量,或者在 代码的关键部分禁用中断)。可重入函数一般要比不可重入的线程安全函数效率高一些,由于它们不须要同步操做。资源

可重入函数能够在任意时刻被中断,稍后再继续运行,不会丢失数据,可重入函数要么使用本地变量,要么在使用全局变量时保护本身 的数据。

     可重入函数的条件:

          1.不在函数内部使用静态或全局数据

          2.不返回静态或全局数据,全部数据都有函数的调用者提供

          3.使用本地数据,或者经过制做全局数据的本地拷贝来保护全局数据

          4.不调用不可重入函数

两者间的区别联系:

  一、可重入函数是线程安全函数的一种,其特色在于它们被多个线程调用时,不会引用任何共享数据。

  二、线程安全是在多个线程状况下引起的,而可重入函数能够在只有一个线程的状况下来讲。

  三、线程安全不必定是可重入的,而可重入函数则必定是线程安全的。

  四、若是一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的。

  5.若是将对临界资源的访问加上锁,则这个函数是线程安全的,但若是这个重入函数若锁还未释放则会产生死锁,所以是不可重入的。

  六、线程安全函数可以使不一样的线程访问同一块地址空间,而可重入函数要求不一样的执行流对数据的操做互不影响使结果是相同的。

相关文章
相关标签/搜索