對比線程安全和可重入函數

一、線程安全函數

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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章