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

線程安全:安全

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

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

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

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

若每一個線程中對全局變量、靜態變量只有讀操做,而無寫操做,通常來講,這個全局變量是線程安全的;如有多個線程同時執行寫操做,通常都須要考慮線程同步,不然的話就可能影響線程安全。spa

可重入函數:線程

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

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

(或者使用信號量,或者在 代碼的關鍵部分禁用中斷)。可重入函數一般要比不可重入的線程安全函數效率高一些,由於它們不須要同步操做。資源

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

     可重入函數的條件:

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

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

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

          4.不調用不可重入函數

兩者間的區別聯繫:

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

  二、線程安全是在多個線程狀況下引起的,而可重入函數能夠在只有一個線程的狀況下來講。

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

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

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

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

相關文章
相關標籤/搜索