对比线程安全和可重入函数

一、线程安全函数

1、什么是线程安全

        一个函数被称为线程安全,当且仅当它被多个并发的进程反复调用时,它会一直产生正确的结果。反之,如果一个函数不是线程安全的,我们就称它是不安全的。  线程安全主

要是针对数据竞争来说的,就是说,如果数据不需要共享,那就让每个数据私有,如果需要共享,就得加锁。

2、如何确保线程安全

       要确保线程安全,主要考虑的是线程之间的共享变量。属于同一进程的不同线程会共享内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器。因此,对于同

一进程的不同的线程来说,每个线程的全局变量都是私有的,而全局变量、局部静态变量、分配于堆的变量都是共享的。在对这些共享变量进行访问时,如果要保证线程安全,

则必须通过加锁的方式。

3、线程不安全的后果

     线程不安全可能导致的后果是显而易见的—-共享变量的值由于不同·线程的访问,可能会发生不可预料的变化,进而导致程序的错误,甚至崩溃。

 二、可重入函数

1、什么是可重入函数

     所谓“重入”,常见的情况是,当程序执行到某个函数func( )时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理函数的执行过

程中,又恰恰也会到刚刚执行的函数func( ),这样便发生了所谓的重入。此时如果func( )能够正确的运行,而且处理完成后,之前暂停的func( )也能够正确运行,则

说明它是可重入的。

2、如何保证可重入

      如果一个函数符合以下条件之一则是不可重入的:

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

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

(3)SUS规定有些系统函数必须以线程安全的方式实现。

三、可重入与线程安全的区别于函数

    1、线程安全是在多个线程情况下引发的,而可重入函数可以在只有一个线程的情况下来说。

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

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

    4、如果将对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重入函数若锁还未释放则会产生死锁,因此是不可重入的。

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

发布了53 篇原创文章 · 获赞 3 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章