可重入與執行緒安全

2022-03-20 22:43:33 字數 954 閱讀 2102

----------可重入------------

概念:

可重入函式,即函式(操作)中斷後,再次進入該函式繼續執行仍能得到正確的結果,這裡強調的是中斷後能正確執行。

舉個例子:

程式執行到某個函式foo()時,收到訊號,於是暫停目前正在執行的函式,轉到訊號處理函式,而這個訊號處理函式的執行過程中,又恰恰也會進入到剛剛執行 的函式foo(),這樣便發生了所謂的重入。此時如果foo()能夠正確的執行,而且處理完成後,之前暫停的foo()也能夠正確執行,則說明它是可重入 的。這裡不涉及到執行緒的概念,重要的是中斷後可重新繼續,並得到正確的結果。

---------執行緒安全--------

概念:

執行緒安全的概念比較直觀。一般說來,乙個函式被稱為執行緒安全的,當且僅當被多個併發執行緒反覆呼叫時,它會一直產生正確的結果。強調多執行緒併發呼叫不會發生錯誤。

形式:

1)函式內部含有共享資料,但是**段操作本身是原子操作,那麼這個函式是執行緒安全的。比如對乙個位寬內的變數進行賦值操作。

2)函式內部操作加鎖互斥,通過這種方式,保證只有當乙個執行緒執行完該段**後,另乙個執行緒才能來執行,保證資料不受汙染。

注釋:原子操作:在cpu乙個時間片內可以執行完成的操作,也就是一條彙編指令可以完成的操作;

區別:

以上兩個概念經常有人讓人混淆不清,那麼請注意兩個概念的紅字部分,這也就是他們的區別。

有概念提出可重入的函式一定是執行緒安全的,個人覺得,這種提法雖然沒有錯誤,執行緒安全本身就是為了保護共享資料,可重入函式本身並不涉及共享資料的保護,且資料都有獨立的棧空間,談不談執行緒安全也沒有什麼意義。且這種提法容易使人混淆執行緒安全和可重入的概念。

可重入與執行緒安全

之前一直糾結可重入與執行緒安全的區別,今天詳細查了一下。其實根據兩個概念的名字就可以得出結論,可重入就是重複多次結果都是一樣的,而執行緒安全則不一樣,只要不同執行緒執行的時候不會出現因不同執行緒執行順序不同而結果不同就可以。大多數情況下,要將不可重入函式改為可重入的,需要修改函式介面,使得所有的資料...

執行緒安全與可重入

1 什麼是執行緒安全 當乙個函式被多個執行緒反覆呼叫的時候,他會一直產生正確的結果,那麼這個函式就是執行緒安全的。執行緒安全函式解決了多個執行緒呼叫函式時訪問臨界資源的衝突問題。2 可重入 在多執行緒或有異常控制流的情況下,當某個函式執行到中途時,控制流有可能被打斷去執行另乙個函式,而這 另乙個函式...

可重入與執行緒安全

概念 可重入性class counter void increment void decrement intvalue const private int n counter類是可重入,但不是執行緒安全的。因為 和 操作符不是原子性的,它們通常要經歷以下三個步驟 暫存器讀取記憶體中變數的值 增加或減...