C 語言編程 — 線程安全與線程非安全

目錄

線程安全與線程非安全

多線程程序中,線程安全是必須要考慮的因素。

線程安全(Thread Safe)就是在多線程環境中,多個線程在同一時刻對同一份資源(e.g. 寄存器、內存空間、全局變量、靜態變量 etc.)進行寫操作(讀操作不會涉及線程安全的問題)時,不會出現數據不一致。反正,則是線程非安全(None-Thread Safe)的。

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

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

C 語言的線程非安全函數(不可重入函數)

C語言中大部分函庫函數都是線程安全的,但是也有幾個常用函數是線程不安全的,也叫不可重入函數。

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

常見的線程不安全類型有兩類:

  1. 函數依賴了全局變量,並且會修改全局變量,如 rand() 函數的實現每次調用都會修改和讀取一個全局的 INT。
  2. 函數返回了靜態變量,如 ctime() 函數。

C 語言的不可重入函數彙總:
在這裏插入圖片描述

C 語言常用的多線程庫:一般是 pthread,當然也可以使用 GLIB 中的 gthread,上述的線程安全版本可以兼容這兩個庫開發的多線程程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章