1、線程安全安全
若是你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。若是每次運行結果和單線程運行的結果是同樣的,並且其餘的變量的值也和預期的是同樣的,就是線程安全的。
或者說:一個類或者程序所提供的接口對於線程來講是原子操做或者多個線程之間的切換不會致使該接口的執行結果存在二義性,也就是說咱們不用考慮同步的問題。
線程安全問題都是由全局變量及靜態變量引發的。
若每一個線程中對全局變量、靜態變量只有讀操做,而無寫操做,通常來講,這個全局變量是線程安全的;如有多個線程同時執行寫操做,通常都須要考慮線程同步,不然就可能影響線程安全。 線程安全就是多線程訪問時,採用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其餘線程不能進行訪問直到該線程讀取完,其餘線程纔可以使用。不會出現數據不一致或者數據污染。 線程不安全就是不提供數據訪問保護,有可能出現多個線程前後更改數據形成所獲得的數據是髒數據。多線程
2、可重入函數併發
可重入(reentrant)函數能夠由多於一個任務併發使用,而沒必要擔憂數據錯誤。相反,不可重入(non-reentrant)函數不能由超過一個任務所共享,除非能確保函數的互斥(或者使用信號量,或者在代碼的關鍵部分禁用中斷)。可重入函數能夠在任意時刻被中斷,稍後再繼續運行,不會丟失數據。可重入函數要麼使用本地變量,要麼在使用全局變量時保護本身的數據。ide
可重入函數不爲連續的調用持有靜態數據;不返回指向靜態數據的指針;全部數據都由函數的調用者提供;使用本地數據,或者經過製做全局數據的本地拷貝來保護全局數據。毫不調用任何不可重入函數。函數
3、二者的區別與聯繫spa
函數能夠是可重入的,是線程安全的,或者兩者皆是,或者兩者皆非。不可重入的函數不能由多個線程使用。另外,或許不可能讓某個不可重入的函數是線程安全的。線程
一、可重入函數是線程安全函數的一種,其特色在於它們被多個線程調用時,不會引用任何共享數據。指針
可重入函數與線程安全的區別與聯繫:orm
二、線程安全是在多個線程狀況下引起的,而可重入函數能夠在只有一個線程的狀況下來講。blog
三、線程安全不必定是可重入的,而可重入函數則必定是線程安全的。
四、若是一個函數中有全局變量,那麼這個函數既不是線程安全也不是可重入的。
5.若是將對臨界資源的訪問加上鎖,則這個函數是線程安全的,但若是這個重入函數若鎖還未釋放則會產生死鎖,所以是不可重入的。
六、線程安全函數可以使不一樣的線程訪問同一塊地址空間,而可重入函數要求不一樣的執行流對數據的操做互不影響使結果是相同的。