執行緒安全與可重入函式

2021-07-23 04:47:36 字數 1372 閱讀 4847

什麼是執行緒安全?

執行緒安全指的是在多執行緒訪問情況下,保證執行緒對臨界資源的操作原子性,在臨界區中,不允許其他的執行緒進行插入訪問造成了資料的亂序占用而修改,產生邏輯結果不一致的問題。

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

其實對於執行緒安全簡單來說,就是保證在多執行緒情況下,我們進行的操作,不論是否控制臨界區的插入訪問,只要保證資料邏輯結果的原子性就是執行緒安全的,但若出現資料的亂序操作或者中斷操作,達不到預期的結果則就是執行緒不安全的。

那麼對於執行緒安全來說,我們通過各種控制臨界區的執行許可權來進行限制,可以閱讀之前的博文來進行執行緒的同步與互斥,執行緒本身就是為了共享資源而產生,利用同步與互斥來進行任務邏輯上的執行,既保證協同,***邏輯獨有。

執行緒就是乙個執行流,乙個指令序列,乙個指令分支,也就是乙個函式。那麼對於函式而言,存在著不需要進行互斥控制的情況,也就是在多執行緒情況下,無論執行緒之間是如何執行插入修改,都能夠保證資料的正確性,就是可重入函式。訊號捕捉也是進行函式的操作,所以訊號跟執行緒在原理上是相似的。

先舉乙個不可重入函式的例子:

針對這張,我們來分析一下他的過程。

在insert函式中,我們很明顯的知道,他是乙個頭插的函式,

然後在insert函式執行之中,倘若在p->next = head之後,head = p之前產生了乙個訊號捕捉,或者同時執行多個執行緒,在多個執行緒之中,執行緒中斷插入在這之間,就會出現上的結果。

也就是我們要達到的目的是我們要插入2個資料,但是卻只插入了乙個資料,另外乙個資料出現了空間浪費,目的不達到,並產生了髒資料。

insert函式被不同的控制流程呼叫,有可能在第一次呼叫還沒返回時就再次進入該函式,這稱為重入,insert函式訪問乙個全域性鍊錶,有可能因為重入而造成錯亂,像這樣的函式稱為不可重入函式,反之,如果乙個函式只訪問自己的區域性變數或引數,則稱為可重入(reentrant) 函式。

為什麼兩個不同的控制流程呼叫同乙個函式,訪問它的同乙個區域性變數或引數就不會造成錯亂?

不可重入函式的條件:

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

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

sus規定有些系統函式必須以執行緒安全的方式實現,這裡就不列了。

總結:對於執行緒安全來說,就是保證在多執行緒邏輯環境下的資料操作不產生***影響,從而出現了各種保證執行緒安全的操作,條件變數,訊號量,各種鎖。

執行緒實際上是乙個指令序列,乙個執行流,乙個函式。所以對於執行緒之中,若在多執行緒環境下不論怎麼中斷插入,都不影響資料邏輯的函式叫做可重入函式。

本文出自 「剩蛋君」 部落格,請務必保留此出處

執行緒安全與可重入函式

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

可重入函式與執行緒安全

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

可重入函式與執行緒安全

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