線程安全與可重入函數

線程安全:如果多線程同時運行同一代碼塊的結果每次都和單線程運行的結果一樣,則就是線程安全的

◆線程不安全的本質原因是資源共享。 所以不使用任何共享數據的線程是安全的

◆使用全局變量的函數是非線程安全的。

◆使用靜態數據或其他共享資源的函數,必須通過加鎖的方式來使函數實現線程安全。

◆可以通過線程同步將一個不安全線程轉變成安全的


可重入函數:可重入函數主要用於多任務環境中,即它可以被多個執行流調用,它是一種可中斷函數。它可以在任意時刻被中斷,而當它被中斷後,系統去執行另一段代碼,再次回到中斷的地方執行後面的代碼時不會出現任何錯誤。如果出現結果錯誤則這個函數就是不可重入函數。

滿足下列條件的函數多數是不可重入的:

1) 函數體內使用了靜態的數據結構;

2) 函數體內調用了malloc()或者free()函數;

3) 函數體內調用了標準I/O函數。

可重入函數編寫規範爲:

1、不在函數內部使用靜態或全局數據 
2、不返回靜態或全局數據,所有數據都由函數的調用者提供。 
3、使用本地數據,或者通過製作全局數據的本地拷貝來保護全局數據。
4、如果必須訪問全局變量,利用互斥機制來保護全局變量。
5、不調用不可重入函數。


線程安全與可重入函數之間的關係:
1、一個函數對於多個線程是可重入的,則這個函數是線程安全的。
2、一個函數是線程安全的,但並不一定是可重入的。【使用互斥鎖實現的線程安全】
3、可重入性要強於線程安全性。


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