C 語言程式設計 執行緒安全與執行緒非安全

2021-10-06 04:03:56 字數 884 閱讀 7231

多執行緒程式中,執行緒安全是必須要考慮的因素。

執行緒安全(thread safe)就是在多執行緒環境中,多個執行緒在同一時刻對同乙份資源(e.g. 暫存器、記憶體空間、全域性變數、靜態變數 etc.)進行寫操作(讀操作不會涉及執行緒安全的問題)時,不會出現資料不一致。反正,則是執行緒非安全(none-thread safe)的。

為了確保在多執行緒環境中的執行緒安全,就要確保資料的一致性,即:執行緒安全檢查。這是一種對資源寫操作進行控制的方**,最簡單的方式就是保證多個執行緒對同一資源的讀寫順序,即:加鎖機制。

顯然,執行緒安全檢查的實現會帶來一定的系統開銷。相對的,在單執行緒環境中並不需要考慮執行緒安全的問題。這就引入了多執行緒和單執行緒的執行效率問題,很難一概而論,而是需要針對不同的場景進行效能的測試才可以得出結果。

c語言中大部分函庫函式都是執行緒安全的,但是也有幾個常用函式是執行緒不安全的,也叫不可重入函式。

執行緒不安全函式原因:是因為這些系統函式使用了某些全域性或者靜態變數。我們知道,全域性變數和靜態變數分別對應記憶體中的全域性變數區和靜態儲存區,這些區域都是可以跨函式跨執行緒訪問的。一旦在多執行緒環境中使用,在沒有加鎖的情況下,對同一段記憶體塊進行併發讀寫,就會造成 segmentfault/coredump 之類的問題。

常見的執行緒不安全型別有兩類:

函式依賴了全域性變數,並且會修改全域性變數,如 rand() 函式的實現每次呼叫都會修改和讀取乙個全域性的 int。

函式返回了靜態變數,如 ctime() 函式。

c 語言的不可重入函式彙總:

c 語言常用的多執行緒庫:一般是 pthread,當然也可以使用 glib 中的 gthread,上述的執行緒安全版本可以相容這兩個庫開發的多執行緒程式。

執行緒安全與非執行緒安全的區別

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

PHP執行緒安全與非執行緒安全的區別

原文 windows版的php從版本5.2.1開始有thread safe 執行緒安全 和none thread safe nts,非執行緒安全 之分,這兩者不同在於何處?到底應該用哪種?這裡做乙個簡單的介紹。因此,如果是使用isapi的方式來執行php就必須用thread safe 執行緒安全 的...

Java執行緒安全和非執行緒安全

arraylist是非執行緒安全的,vector是執行緒安全的 hashmap是非執行緒安全的,hashtable是執行緒安全的 stringbuilder是非執行緒安全的,stringbuffer是執行緒安全的 什麼是執行緒安全?執行緒安全和非執行緒安全有什麼區別?分別在什麼情況下使用?非執行緒安...