線程安全和可重入函數

一、線程安全
1、什麼是線程安全?
如果一個進程中有多個線程在同時運行,這些線程可能會同時運行同一段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就表示線程是安全的。
線程安全問題是由全局變量和靜態變量引起的。
2、如何避免線程安全問題
(1)使用線程安全的類
(2)使用synchronized同步代碼塊,或者用Lock鎖
(3)多線程併發情況下,線程共享的變量改爲方法局部級
變量
二、可重入函數
1、什麼叫可重入函數?
信號的捕捉可以讓進程內部有多種執行流,被兩個或者多個執行流進入同一個函數叫做重入。若因爲重入的原因導致函數的結果出錯,則該函數叫做不可重入函數。
2、不可重入函數
(1)調用了malloc或者free,因爲malloc和free是用全局鏈表來管理堆的;
(2)調用了標準I/O庫函數,標準I/O庫的實現很多都以不可重入的方式使用全局數據結構;
(3)某些被規定用線程安全的方式實現的函數;
(4)函數體內使用了靜態變量;
(5)函數返回靜態變量或者靜態的數據結構;
(6)函數調用了不可重入函數。
3、可重入函數
(1)不使用全局或者靜態變量;
(2)不返回指向靜態數據的指針,所有數據都由函數調用者來提供;
(3)使用本地數據,或通過製作全局數據的本地拷貝來保護全局數據;
(4)不調用不可重入函數。
4、可重入函數的特點
(1)可重入函數可以被多個任務同時調用,而不擔心數據會被破壞;
(2)可重入函數在任何時刻都可以被中斷,一段時間之後又可以返回到中斷之前的狀態,而不擔心數據會丟失;
(3)可重入函數若要使用全局變量,則要對全局變量進行保護。
三、對比線程安全和可重入函數
1、可重入的函數一定是線程安全的函數;
2、線程安全的函數不一定是可重入函數;
3、可重入性強於線程安全性。

發佈了47 篇原創文章 · 獲贊 32 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章