執行緒安全和可重入函式

2021-08-03 05:53:02 字數 933 閱讀 5928

簡單來說,在執行環境一致的情況下,多次執行同乙個多執行緒程式時,所有執行緒結果和單執行緒執行得到的結果一致時,則可以說該程式的執行緒是安全的。反之,則為執行緒不安全。

引起執行緒安全問題的原因:

通常都是由全域性變數及靜態變數的。

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

避免執行緒不安全的方法:

當程式**是多執行緒訪問時,通常採用了加鎖機制來保證執行緒安全。

乙個類要成為執行緒安全的,在被多個執行緒訪問時,只有在所有執行緒看來,對於執行緒安全物件的操作是以固定的、全域性一致的順序發生的。才能保證執行緒安全。必須**不同執行緒所執行的物件操作是有先後順序的而不是並行執行的。

故我認為,可以簡單的把引起執行緒安全問題的全域性變數及靜態變數看做臨界資源,利用加鎖機制,達到同一時刻只允許乙個執行緒訪問,以此來保證執行緒安全。

而對於可重入函式,首先需要明確的是可重入函式主要用於多工環境中,可重入的函式簡單來說就是可以被中斷的函式,也就是說,可以在這個函式執行的任何時刻中斷它,轉入os排程下去執行另外一段**,而返回控制時不會出現什麼錯誤;而不可重入的函式由於使用了一些系統資源,比如全域性變數區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函式是不能執行在多工環境下的。

函式不可重入的可能條件:

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

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

故顯而易見的,幾乎所有的資料結構的**都屬於不可重入的。

而兩個不同的控制流程調⽤同⼀個函式,訪問它的同乙個局 部變數或引數就不會造成錯亂,是因為每個執行流都會建立自己的棧楨,彼此訪問的都是自己的棧楨,就不會相互干擾而導致程式結果出錯。

分享如上,如有問題,望斧正!

執行緒安全和可重入函式

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

執行緒安全和可重入函式

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

執行緒安全和可重入函式

執行緒安全 1.執行緒安全 就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。2.執行緒不安全 就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料受到汙染...