Linux中的執行緒安全和可重入函式

2021-08-03 02:30:46 字數 2430 閱讀 2125

一、執行緒安全:

執行緒安全

就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。

程不安全

就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料。

例如下面這幾個函式就被稱為執行緒不安全函式:

(1).不保護共享變數的函式

(2).保持跨過多個狀態呼叫的函式

(3).返回指向靜態變數指標的函式

(4).呼叫執行緒不安全函式的函式

如果你的**所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段**。如果每次執行結果和

單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。或者說:乙個類或者程式所提供的介面對於執行緒來說是

原子操作

或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題。

執行緒安全問題都是由

全域性變數

及靜態變數

引起的。

若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮

執行緒同步

,否則的話就可能影響執行緒安全。

一般來說,乙個函式被稱為執行緒安全的,

當且僅當被多個併發執行緒反覆呼叫時,

它會一直產生正確的結果。

二、可重入函式:

「重入」即表示重複進入,首先它意味著這個函式可以被中斷,其次意味著它除了使用自己棧上的變數以外不依賴於任何環境(包括static),這樣的函式就是

可重入,可以允許有多個該函式的副本在執行,由於它們使用的是分離的棧,所以不會互相干擾。如果確實需要訪問

全域性變數

(包括static),一定要注意實施互斥手段。可重入函式在並行執行環境中非常重要,但是一般要為訪問全域性變數付出一些效能代價。

可重入函式是執行緒安全函式的一種,

主要用於多工環境中,乙個可重入的函式簡單來說就是可以被中斷的函式,也就是說,可以在這個函式執行的任何時刻中斷它,轉入os排程下去執行另外一段**,而返回控制時不會出現什麼錯誤;而不可重入的函式由於使用了一些系統資源,比如

全域性變數

區,中斷向量表

等,所以它如果被中斷的話,可能會出現問題,這類函式是不能執行在多工環境下的。

可重入函式的分類

(1)顯式可重入函式

如果所有函式的引數都是傳值傳遞的(沒有指標),並且所有的資料引用

都是本地的自動棧變數

(也就是說沒有引用靜態或全域性變數),那麼函式就是顯示可重入的,也就是說不管如何呼叫,我們都可斷言它是可重入的。

(2)隱式可重入函式

可重入函式中的一些引數是引用傳遞(使用了指標),也就是說,在呼叫執行緒小心地傳遞指向非共享資料的指標時,它才是可重入的。

可重入函式可以有多餘乙個任務併發使用,而不必擔心資料錯誤,相反,不可重入函式不能由超過乙個任務所共享,除非能確保函式的互斥(或者使用訊號量,或者在 **的關鍵部分禁用中斷)。可重入函式可以在任意時刻被中斷,稍後再繼續執行,不會丟失資料,可重入函式要麼使用本地變數,要麼在使用全域性變數時保護自己 的資料。

乙個可重入函式需要滿足的是:

1、不使用全域性變數或靜態變數;

2、不使用用malloc或者new開闢出的空間;

3、不呼叫不可重入函式;

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

5、使用本地資料,或者通過製作全域性資料的本地拷貝來保護全域性資料;

可重入函式特點:由於可重入函式多次呼叫不會出錯,因此可重入函式不用擔心資料會被破壞。可重入函式任何時候都可以被中斷,一段時間後又可以執行,而相應的資料不會丟失。可重入函式只使用區域性變數,即儲存在cpu暫存器或者堆疊中;或者如果使用全域性變數時,則要對全域性變數予以保護。

三、可重入函式和執行緒安全的區別和聯絡:

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

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

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

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

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

Linux 可重入和執行緒安全

概念 執行緒安全 多個執行緒併發執行同一段 時,不會出現不同的結果,稱之為執行緒安全。常見對全域性變數或者靜態變數進行操作,並且沒有鎖保護的情況下,會出現該問題。重入 同乙個函式被不同的執行流呼叫,當前乙個流程還沒有執行完,就有其他的執行流再次進入,稱之為重入。乙個函式在重入的情況下,執行結果不會出...

linux中可重入函式和執行緒安全

乙個可重入函式簡單來說是可以被中斷的函式,也就是說,可以在這個函式執行的任何時候中斷它,轉入os排程下去執行另一段 而返回控制時不會出現什麼錯誤。可以被訊號控制器安全呼叫的函式稱為 非同步訊號安全函式 可重入函式與非同步訊號安全函式時乙個概念。執行緒安全 乙個函式被稱為執行緒安全的,當且僅當被多個併...

可重入和執行緒安全

執行緒安全這個詞對我來說已經不是很陌生的了,但是遇到乙個叫做可重入函式的詞,它給我的感覺和執行緒安全是這麼的相近,但既然拿出來了,肯定是有區別的,下面就說說他們之間的區別和聯絡。要先解釋這兩個詞語才行。執行緒安全 似乎是在牛客網刷題的時候看到乙個正確的選項說的是,執行緒安全問題都是由全域性變數及靜態...