可重入函式與執行緒安全

2021-07-31 12:21:45 字數 988 閱讀 4162

可重入函式:

當程式被多個執行緒反覆執行,產生的結果正確。如果乙個函式只訪問自己的區域性變數或引數,稱為可重入函式。

不可重入:

當程式被多個執行緒反覆呼叫,產生的結果出錯。

當函式訪問乙個全域性的變數或者引數時,有可能因為重入而造成混亂,像這樣的函式稱為不可重入函式

如果⼀個函式符合以下條件之⼀則是不可重⼊的:

(1)調⽤了malloc或free,因為malloc也是⽤全域性鍊錶來管理堆的。

(2)調⽤了標準i/o庫函式。標準i/o庫的很多實現都以不可重⼊的⽅式使⽤全域性資料結構。

(3)sus規定有些系統函式必須以執行緒安全的⽅式實現,這⾥就不列了。

執行緒安全:

一般來講就是乙個**塊被多個併發執行緒反覆呼叫時會一直產生正確的結果。

執行緒安全問題都是由全域性變數及靜態變數引起的。任何未使用靜態資料或其他共享資源的函式都是執行緒安全的。而使用全域性變數或靜態區域性變數的函式是非執行緒安全的。

使用靜態資料或其他共享資源的函式,必須通過加鎖的方式來使函式實現執行緒安全。

執行緒安全函式解決多個執行緒呼叫函式時訪問共享資源的衝突問題。

可重入函式與執行緒安全間的關係與區別:

(1)執行緒安全是在多個執行緒情況下引發的,而可重入函式可以在只有乙個執行緒的情況下來說。

(2)執行緒安全不一定是可重入的,而可重入函式則一定是執行緒安全的。

(3)如果乙個函式中有全域性變數,那麼這個函式既不是執行緒安全也不是可重入的。

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

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

執行緒安全與可重入函式

可重入函式 reentrant function 與執行緒安全函式 thread safe function 有時容易混淆,而且各種文件中的解釋也不是很清楚,這裡根據筆者的經驗來說明一下。執行緒安全函式 概念 執行緒安全的概念比較直觀。一般說來,乙個函式被稱為執行緒安全的,當且僅當被多個併發執行緒反...

可重入函式與執行緒安全

執行緒安全 乙個函式被稱為執行緒安全的 thread safe 當且僅當被多個併發程序反覆呼叫時,它會一直產生正確的結果。如果乙個函式不是執行緒安全的,我們就說它是執行緒不安全的 thread unsafe 我們定義四類 有相交的 執行緒不安全函式。將這類執行緒不安全函式變為執行緒安全的,相對比較容...

可重入函式與執行緒安全

可重入函式與執行緒安全 執行緒安全 假如在乙個函式中它是這麼寫的,在乙個全域性鍊錶上存放資料,在單執行緒模式下,我們先new乙個新的節點然後讓head next指向這個節點,這種場景在多執行緒場景下會是這樣的過程,執行緒一new了乙個節點,然後cpu轉去執行執行緒二,執行緒二new乙個節點後head...