什麼是執行緒安全:乙個函式被稱為執行緒安全的(thread-safe),當且僅當被多個併發程序反覆呼叫時,它會一直產生正確的結果。反之,如果乙個函式不是執行緒安全的,我們就說它是執行緒不安全的(thread-unsafe)。所以,有這麼四類函式稱為執行緒不安全的:
不保護共享變數的函式;
函式狀態隨著呼叫改變的函式;
返回指向靜態變數指標的函式;
呼叫執行緒不安全函式的函式
什麼是可重入函式:可重入函式是執行緒安全函式的一種,其特點在於它們被多個執行緒呼叫時,不會引用任何共享資料。函式是可重入(reentrant)的,是指對於相同的(並且合法的)函式引數(包括無參函式的情況),多次呼叫此函式產生的行為是可預期的,即函式的行為一致,或者結果相同。不能保證這一點的函式稱為不可重入(non-reentrant)函式。
它又分為這麼兩種:
顯式可重入函式:如果所有函式的引數都是傳值傳遞的(沒有指標),並且所有的資料引用都是本地的自動棧變數(也就是說沒有引用靜態或全域性變數),那麼函式就是顯示可重入的,也就是說不管如何呼叫,我們都可斷言它是可重入的。
隱式可重入函式:可重入函式中的一些引數是引用傳遞(使用了指標),也就是說,在呼叫執行緒小心地傳遞指向非共享資料的指標時,它才是可重入的。
可見,可重入函式的可重入性是有時是呼叫者與被呼叫這共有的屬性,並不只是被呼叫者的屬性。
對比:
可重入和執行緒安全(thread-safe)是兩個不同的概念:可重入函式一定是執行緒安全的;執行緒安全的函式可能是重入的,也可能是不重入的;執行緒不安全的函式一定是不可重入的。
可重入函式要解決的問題是,不在函式內部使用靜態或全域性資料,不返回靜態或全域性資料,也不呼叫不可重入函式。
執行緒安全函式要解決的問題是,多個執行緒呼叫函式時訪問資源衝突。
函式如果使用靜態變數,通過加鎖後可以轉成執行緒安全函式,但仍然有可能不是可重入的。
執行緒安全與可重入函式
可重入函式 reentrant function 與執行緒安全函式 thread safe function 有時容易混淆,而且各種文件中的解釋也不是很清楚,這裡根據筆者的經驗來說明一下。執行緒安全函式 概念 執行緒安全的概念比較直觀。一般說來,乙個函式被稱為執行緒安全的,當且僅當被多個併發執行緒反...
可重入函式與執行緒安全
執行緒安全 乙個函式被稱為執行緒安全的 thread safe 當且僅當被多個併發程序反覆呼叫時,它會一直產生正確的結果。如果乙個函式不是執行緒安全的,我們就說它是執行緒不安全的 thread unsafe 我們定義四類 有相交的 執行緒不安全函式。將這類執行緒不安全函式變為執行緒安全的,相對比較容...
可重入函式與執行緒安全
可重入函式與執行緒安全 執行緒安全 假如在乙個函式中它是這麼寫的,在乙個全域性鍊錶上存放資料,在單執行緒模式下,我們先new乙個新的節點然後讓head next指向這個節點,這種場景在多執行緒場景下會是這樣的過程,執行緒一new了乙個節點,然後cpu轉去執行執行緒二,執行緒二new乙個節點後head...