對比執行緒安全和可重入函式

2021-08-02 09:41:06 字數 1301 閱讀 1496

一、執行緒安全函式

1、什麼是執行緒安全

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

要是針對資料競爭來說的,就是說,如果資料不需要共享,那就讓每個資料私有,如果需要共享,就得加鎖。

2、如何確保執行緒安全

要確保執行緒安全,主要考慮的是執行緒之間的共享變數。屬於同一程序的不同執行緒會共享記憶體空間中的全域性區和堆,而私有的執行緒空間則主要包括棧和暫存器。因此,對於同

一程序的不同的執行緒來說,每個執行緒的全域性變數都是私有的,而全域性變數、區域性靜態變數、分配於堆的變數都是共享的。在對這些共享變數進行訪問時,如果要保證執行緒安全,

則必須通過加鎖的方式。

3、執行緒不安全的後果

執行緒不安全可能導致的後果是顯而易見的—-共享變數的值由於不同·執行緒的訪問,可能會發生不可預料的變化,進而導致程式的錯誤,甚至崩潰。

二、可重入函式

1、什麼是可重入函式

所謂「重入」,常見的情況是,當程式執行到某個函式func( )時,收到訊號,於是暫停目前正在執行的函式,轉到訊號處理函式,而這個訊號處理函式的執行過

程中,又恰恰也會到剛剛執行的函式func( ),這樣便發生了所謂的重入。此時如果func( )能夠正確的執行,而且處理完成後,之前暫停的func( )也能夠正確執行,則

說明它是可重入的。

2、如何保證可重入

如果乙個函式符合以下條件之一則是不可重入的:

(1)呼叫了malloc或free,因為malloc也是用全域性鍊錶來管理堆的。

(2)呼叫了標準i/o庫函式。標準i/o庫的很多現實都以不可重入的方式使用全域性資料結構。

(3)sus規定有些系統函式必須以執行緒安全的方式實現。

三、可重入與執行緒安全的區別於函式

1、執行緒安全是在多個執行緒情況下引發的,而可重入函式可以在只有乙個執行緒的情況下來說。

2、執行緒安全不一定是可重入的,而可重入函式則一定是執行緒安全的。

3、若果乙個函式中有全域性變數,那麼這個函式既不是執行緒安全也不是可重入的。

4、如果將對臨界資源的訪問加上鎖,則這個函式是執行緒安全的,但如果這個重入函式若鎖還未釋放則會產生死鎖,因此是不可重入的。

5、執行緒安全函式能夠使不同的執行緒訪問同一塊位址空間,而可重入函式要求不同的執行流對資料的操作互不影響使結果是相同的。

對比執行緒安全和可重入函式

函式被不同的控制流程呼叫,有可能在第一次呼叫還沒返回時就再次 進入該函式,這稱為重入。然而有可能因為重入而造成錯亂,像這樣 的函式稱為不可重入函式,反之,如果乙個函式只訪問自己的區域性變數或引數,則稱為可重入 reentrant 函式。可重入函式 重入即表示重複進入,首先它意味著這個函式可以被中斷,...

對比執行緒安全和可重入函式

1 執行緒安全 1 概念 執行緒安全的概念比較直觀。一般說來,乙個函式被稱為執行緒安全的,當且僅當被多個併發執行緒反覆呼叫時,它會一 直產生正確的結果。如果你的程式所在的程序中有 多個執行緒在同時執行 而這些執行緒可能 同時執行一段 或同時訪 問乙個物件 如果每次執行完這段 或訪問完這個物件之後,所...

執行緒安全和可重入函式

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