線程安全和可重入函數的區別與聯繫

線程安全:

    一般來說,一個函數被稱爲線程安全的,當且僅當被多個併發線程反覆調用時,它會一直產生正確的結果。就是多線程訪問時,採用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程纔可使用。不會出現數據不一致或者數據污染。

如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和 運行的結果是一樣的,而且其他的變量的值也和預期的是一樣  的, 就是線程安全的。

或者說:一個類或者程序所提供的接口對於線程來說是原子操作或者多個線程之間的切換不會導致該接口的執行結果存在二義性,也就是說我們不用考慮同步的問題。

線程安全問題都是由全局變量及靜態變量引起的。

若每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則的話就可能影響線程安全。

可重入函數:

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

可重入函數可以有多餘一個任務併發使用,而不必擔心數據錯誤,相反,不可重入函數不能由超過一個任務所共享,除非能確保函數的互斥

(或者使用信號量,或者在 代碼的關鍵部分禁用中斷)。可重入函數通常要比不可重入的線程安全函數效率高一些,因爲它們不需要同步操作。

可重入函數可以在任意時刻被中斷,稍後再繼續運行,不會丟失數據,可重入函數要麼使用本地變量,要麼在使用全局變量時保護自己 的數據。

     可重入函數的條件:

          1.不在函數內部使用靜態或全局數據

          2.不返回靜態或全局數據,所有數據都有函數的調用者提供

          3.使用本地數據,或者通過製作全局數據的本地拷貝來保護全局數據

          4.不調用不可重入函數

二者間的區別聯繫:

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

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

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

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

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

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




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