執行緒安全和可重入函式

2021-08-01 00:12:37 字數 841 閱讀 3582

執行緒安全:乙個函式稱為執行緒安全,當且僅當被多個併發執行緒反覆呼叫時,它一直產生正確的結果。如果乙個函式不是執行緒安全的,我們就說它是執行緒不安全的。

以下我們定義4種,執行緒不安全的函式:

(第1類):不保護共享變數的函式,比如對乙個全域性變數多個執行緒操作,產生錯誤結果;

解決方法:利用像p,v操作這樣的同步操作保護共享變數,優點:不用改**,缺點:程式執行時間變慢。

(第2類):保持跨越多個呼叫的狀態函式,簡單說就是多個執行緒正在被呼叫的函式裡呼叫了別的函式,例如rand函式;

這樣沒辦法得重寫。

(第3類):返回指向靜態變數的指標的函式,不安全因為乙個正在使用的結果會被另乙個程序覆蓋掉。

解決方法:可以使用加鎖—拷貝技術:將執行緒不安全的函式與互斥鎖聯絡起來。在每乙個呼叫的位置對互斥鎖加鎖,呼叫執行緒不安全函式,將結果拷貝到私有儲存位置,然後對互斥鎖解鎖,每個執行緒使用自己的私有拷貝。

(第4類:)呼叫執行緒不安全函式。

可重入函式具有:當它們被多個多個執行緒呼叫不會引起任何共享資料

是一類重要的執行緒安全函式。

顯示可重入:如果所有函式都是傳值,且所有資料的引用都是本地的自動棧變數,那麼這個函式無論被如何的呼叫它都是執行緒安全的。

隱式可重入:函式引數傳的的是指標,如果呼叫的執行緒小心的傳遞的指向非共享資料的指標,那麼它是執行緒安全的。

還有一點:可重入性有時既是呼叫者也是被呼叫者的屬性,並不是只有被呼叫者單調具有的屬性。

執行緒安全和可重入函式

執行緒安全 當多個併發執行緒執行同乙個函式,我們都能得到正確的返回值。當多個執行緒併發的呼叫乙個函式。如果對全域性資料或者靜態資料在不加任何鎖以及安全性的處理情況下,就會對多次修改資料的錯誤。比如我正在願意個執行緒裡處理乙個全域性變數的 1 正減完。結果還沒有返回,就被另乙個執行緒切出去了,而那個執...

執行緒安全和可重入函式

簡單來說,在執行環境一致的情況下,多次執行同乙個多執行緒程式時,所有執行緒結果和單執行緒執行得到的結果一致時,則可以說該程式的執行緒是安全的。反之,則為執行緒不安全。引起執行緒安全問題的原因 通常都是由全域性變數及靜態變數的。若每個執行緒中對全域性變數 靜態變數只有讀操作,而無寫操作,一般來說,這個...

執行緒安全和可重入函式

執行緒安全 1.執行緒安全 就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。2.執行緒不安全 就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料受到汙染...