執行緒安全和可重入函式

2021-08-03 12:29:56 字數 1362 閱讀 3992

執行緒安全

1.執行緒安全

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

2.執行緒不安全

就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料受到汙染。(解決方法:

基本上所有的併發模式在解決執行緒安全問題上,都採用「序列化訪問臨界資源」的方案,即在同一時刻,只能有乙個執行緒訪問臨界資源,也稱同步互斥訪問。通常來說,是在訪問臨界資源的**前面加上乙個鎖,當訪問完臨界資源後釋放鎖,讓其他執行緒繼續訪問。)

3.可重入函式

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

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

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

全域性變數

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

4.不可重入函式

由於使用了一些系統資源,比如

全域性變數

區,中斷向量表

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

滿足下列條件就是不可重入函式:

(1)函式體內使用了靜態的資料結構

(2)函式呼叫了malloc()和free()函式

(3)函式體內呼叫了標準的i/o函式

把不可重入函式變成可重入函式的唯一方法就是用重入規則重寫,遵循以下規則寫出來等待函式就是可重入的;

(1)  不使用全域性變數,因為別的**有可能也會使用這個變數,可能會對這個變數值修改。

(2)   在和硬體發生互動的時候,切記執行類似disinterrupt()之類的操作,就是關閉硬體中斷。完成互動記得開啟中斷,在有些系列上,這叫做「進入/退出核心」或者用os_enter_kernal/os_exit_kernal來描述。

(3)不能呼叫任何不可重入的函式。

(4)謹慎使用堆疊。最好先在使用前先os_enter_kernal。

總之,時刻記住一句話:保證中斷是安全的!

因為:由於中斷是可能隨時發生的,

5. 執行緒安全和可重入兩者對比

可重入函式一定是執行緒安全,但執行緒安全不一定是可重入的— —可重入的要求更嚴格。

執行緒安全和可重入函式

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

執行緒安全和可重入函式

執行緒安全 乙個函式稱為執行緒安全,當且僅當被多個併發執行緒反覆呼叫時,它一直產生正確的結果。如果乙個函式不是執行緒安全的,我們就說它是執行緒不安全的。以下我們定義4種,執行緒不安全的函式 第1類 不保護共享變數的函式,比如對乙個全域性變數多個執行緒操作,產生錯誤結果 解決方法 利用像p,v操作這樣...

執行緒安全和可重入函式

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