執行緒安全與可重入

2021-07-27 10:55:05 字數 1008 閱讀 8663

1、什麼是執行緒安全

當乙個函式被多個執行緒反覆呼叫的時候,他會一直產生正確的結果,那麼這個函式就是執行緒安全的。執行緒安全函式解決了多個執行緒呼叫函式時訪問臨界資源的衝突問題。

2、可重入

在多執行緒或有異常控制流的情況下,當某個函式執行到中途時,控制流有可能被打斷去執行另乙個函式,而這」另乙個函式」有可能是他本身,如果在這種情況下不會出現問題,比如與說資料或狀態不被破壞,而且行為可預期,那麼這個函式就被稱為可重入的。反之,就是不可重入函式 。

簡單來說就是:當乙個函式被多個執行緒呼叫的時候,不會引用任何共享資料,那麼這個函式就是可重入的。可重入函式可以在任意時刻被中斷,稍後再繼續執行,也不會丟失資料。反之就是不可重入。

3、執行緒安全與可重入的區別於聯絡

執行緒安全的根源就在於」共享資料」。所以不共享任何資料的函式(可重入函式)肯定是執行緒安全的。但是,即使有共享資料,執行緒安全還可以通過同步與互斥來保證,所以執行緒安全並不一定是可重入的。

關係如圖:

可重入是執行緒安全的乙個真子集,可重入一定執行緒安全,但執行緒安全不一定可重入。

4、怎樣編寫可重入函式

關於執行緒安全,我們可以通過同步與互斥來實現,下面介紹一下編寫可重入函式時的規範:

1、不能在函式內部使用靜態或全域性資料

2、不能返回靜態或全域性資料,所有資料都有函式的呼叫者提供

3、使用本地資料、或通過製作全域性資料的本地拷貝來保護全域性資料。

4、如果必須訪問全域性變數,利用互斥機制來保護全域性變數。

5、不在可重入函式內部呼叫不可重入函式。、

6、不呼叫malloc和free函式,因為malloc是用全域性鍊錶來管理堆的。

7、不呼叫了標準i/o函式。標準i/o函式很多都以不可重入的方式實現全域性資料結構。

總結:最常見的就是在訊號處理函式中不能使用不可重入函式。如果在訊號處理函式中使用了不可重入函式,則可能導致程式出現錯誤甚至崩潰。

可重入與執行緒安全

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

可重入與執行緒安全

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

可重入與執行緒安全

乙個執行緒安全的函式可以同時被多個執行緒呼叫,即便是這些呼叫使用了共享資料。因為該共享資料的所有例項都被序列化了。乙個可重入的函式也可以同時被多個執行緒呼叫,但是只能是在每個呼叫使用自己的資料時。因此,乙個執行緒安全的函式總是可重入的,但是乙個可重入的函式不總是執行緒安全的。推而廣之,如果只要每個執...