執行緒安全與可重入函式

2021-08-02 13:27:20 字數 837 閱讀 4320

執行緒安全

執行緒安全就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。

若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒互斥,比如訊號量(p、v操作),否則的話當多個執行緒呼叫此函式時,很有可能使有關全域性變數變為不可知狀態。

可重入函式

首先它意味著這個函式可以被中斷,其次意味著它除了使用自己棧上的變數以外不依賴於任何環境;並且允許有多個執行緒同時執行,由於它們使用的是分離的棧,所以不會互相干擾。

重入方式

遞迴函式、

多執行緒

可重入的充分條件

1.不使用任何靜態或全域性的非const變數

2.不返回任何靜態或全域性的非const變數的指標

3.僅依賴於呼叫方提供的引數

不依賴任何單個資源的鎖

4.不呼叫任何不可重入的函式

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

1.呼叫了malloc或free,因為malloc也是用全域性鍊錶來管理堆的,同乙個程序維護的是同乙個堆,多執行緒呼叫malloc相當於同時訪問鍊錶,而鍊錶的操作不是原子的。

2.呼叫了標準i/o庫函式,標準i/o庫的很多實現都以不可重⼊的方式使用全域性資料結構的。

可重入函式與執行緒安全的聯絡

可重入函式肯定是執行緒安全的,它的條件比較苛刻,限制使用靜態和全域性資料,限制呼叫不可重入的函式等;

執行緒安全就沒有這麼多限制了,主要以避免資料不一致為目的,可以才用加鎖保護全域性資料,甚至全域性或靜態資料只要是唯讀的都可以不需要保護。

執行緒安全與可重入函式

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

可重入函式與執行緒安全

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

可重入函式與執行緒安全

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