1. 程式人生 > >可重入與執行緒安全

可重入與執行緒安全

 

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

概念:

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

舉個例子:

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

 

 

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

概念:

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

 形式:

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

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

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

 

 

區別:

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

 

 

 

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