執行緒安全與可重入函式

2021-08-02 23:32:33 字數 1143 閱讀 6952

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

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

比如乙個 arraylist 類,在新增乙個元素的時候,它可能會有兩步來完成:1. 在 items[size] 的位置存放此元素;2. 增大 size 的值。

在單執行緒

執行的情況下,如果 size = 0,新增乙個元素後,此元素在位置 0,而且 size=1。

而如果是在多執行緒情況下,比如有兩個執行緒,執行緒 a 先將元素1存放在位置 0。但是此時 cpu 排程執行緒a暫停,執行緒 b 得到執行的機會。執行緒b向此 arraylist新增元素2,因為此時 size 仍然等於 0 (注意,我們假設的是新增乙個元素是要兩個步驟,而執行緒a僅僅完成了步驟1),所以執行緒b也將元素存放在位置0。然後執行緒a和執行緒b都繼續執行,都增加 size 的值,結果size等於2。

有2種解決方法。

第一,是採用原子變數,畢竟執行緒安全

問題最根本上是由於全域性變數和靜態變數

引起的,只要保證了對於變數的寫操作要麼全寫要麼不寫,就可以解決執行緒安全

,定義變數用volatile。

第二,就是實現執行緒間同步啦,用互斥索,訊號量

。讓執行緒有序的訪問變數就可以啦

在編寫乙個類時,如果該類中的**可能執行於多執行緒環境下,那麼就要考慮同步的問題。
三:可重入函式

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

區,中斷向量表

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

執行緒安全與可重入函式

可重入函式 reentrant function 與執行緒安全函式 thread safe function 有時容易混淆,而且各種文件中的解釋也不是很清楚,這裡根據筆者的經驗來說明一下。執行緒安全函式 概念 執行緒安全的概念比較直觀。一般說來,乙個函式被稱為執行緒安全的,當且僅當被多個併發執行緒反...

可重入函式與執行緒安全

執行緒安全 乙個函式被稱為執行緒安全的 thread safe 當且僅當被多個併發程序反覆呼叫時,它會一直產生正確的結果。如果乙個函式不是執行緒安全的,我們就說它是執行緒不安全的 thread unsafe 我們定義四類 有相交的 執行緒不安全函式。將這類執行緒不安全函式變為執行緒安全的,相對比較容...

可重入函式與執行緒安全

可重入函式與執行緒安全 執行緒安全 假如在乙個函式中它是這麼寫的,在乙個全域性鍊錶上存放資料,在單執行緒模式下,我們先new乙個新的節點然後讓head next指向這個節點,這種場景在多執行緒場景下會是這樣的過程,執行緒一new了乙個節點,然後cpu轉去執行執行緒二,執行緒二new乙個節點後head...