線程安全和可重入函數的關係,區別

•概念

重入:即重複調用,函數被不同的流調用,有可能會出現第一次調用還沒返回時就再次進入該函數開始下一次調用。

可重入:當程序被多個線程反覆執行,產生的結果正確。

如果一個函數只訪問自己的局部變量或參數,稱爲可重入函數。

不可重入:當程序被多個線程反覆調用,產生的結果出錯。

當函數訪問一個全局的變量或者參數時,有可能因爲重入而造成混亂,像這樣的函數稱爲不可重入函數。


線性安全:一般來說,一個函數被稱爲線程安全的,當且僅當被多個併發線程反覆調用時,它會一直產生正確的結果。


•可重入特點

由於可重入函數多次調用不會出錯,因此可重入函數不用擔心數據會被破壞。可重入函數任何時候都可以被中斷,一段時間後又可以運行,而相應的數據不會丟失。可重入函數只使用局部變量,即保存在CPU寄存器或者堆棧中;或者如果使用全局變量時,則要對全局變量予以保護。

•不可重入特點

如果一個函數符合以下條件之一的,則是不可重入的:

(1)調用了malloc/free函數,因爲malloc函數是用全局鏈表來管理堆的。

(2)調用了標準I/O庫函數,標準I/O庫的很多實現都以不可重入的方式使用全局數據結構

(3)可重入體內使用了靜態的數據結構。


•可重入與線程安全


可重入函數與線程安全的區別與聯繫:

(1)線程安全是在多個線程情況下引發的,而可重入函數可以在只有一個線程的情況下來說。

(2)線程安全不一定是可重入的,而可重入函數則一定是線程安全的。

(3)如果一個函數中有全局變量,那麼這個函數既不是線程安全也不是可重入的。

(4)如果將對臨界資源的訪問加上鎖,則這個函數是線程安全的,但如果這個重入函數若鎖還未釋放則會產生死鎖,因此是不可重入的。

(5)線程安全函數能夠使不同的線程訪問同一塊地址空間,而可重入函數要求不同的執行流對數據的操作互不影響使結果是相同的。

發佈了50 篇原創文章 · 獲贊 20 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章