可重入函數和線程安全

可重入函數

    如果一個函數被多個執行流調用,有可能在第一次調用還沒有返回時,再次進入這個函數,這稱爲重入。如果這個函數訪問了全局變量或靜態變量,造成結果錯亂,這個函數叫不可重入函數,反之,則稱爲可重入變量。

     可重入函數書寫遵循如下原則:

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


線程安全:

    是指一個函數被多個線程同時運行,運行出的結果和一個線程運行時的結果一樣且是正確的。若每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。 線程安全就是多線程訪問時,採用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程纔可使用。不會出現數據不一致或者數據污染。 線程不安全就是不提供數據訪問保護,有可能出現多個線程先後更改數據造成所得到的數據是髒數據。

兩者區別與聯繫:

   1、可重入函數是線程安全函數的一種,其特點在於它們被多個線程調用時,不會引用任何共享數據。

  2、線程安全是在多個線程情況下引發的,而可重入函數可以在只有一個線程的情況下來說。

  3、線程安全不一定是可重入的,而可重入函數則一定是線程安全的。

  4、如果一個函數中有全局變量,那麼這個函數既不是線程安全也不是可重入的。

  5.如果將對臨界資源的訪問加上鎖,則這個函數是線程安全的,但如果這個重入函數若鎖還未釋放則會產生死鎖,因此是不可重入的。

  6、線程安全函數能夠使不同的線程訪問同一塊地址空間,而可重入函數要求不同的執行流對數據的操作互不影響使結果是相同的。


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