线程安全与可重入
- 定義
線程安全:被多個并發的線程反復調用時,他會產生正確的結果。
可重入:當被多個線程調用的時候,不會引用任何共享數據。
Remark:任何線程不安全問題的根源都是“共享數據”。所以,不使用任何共享數據的函數(即:可重入函數)肯定是線程安全的。但這并不等于說,線程安全函數就是可重入函數。為什么呢?因為:即使有線程有共享數據,線程被并發調用的時候產生的結果可以是正確的。那么這種正確性是如何保證的呢?對,就是通過同步操作。
- ?線程不安全的根源
上面已經提到,線程不安全的根源在于:共享數據。
共享數據可以是:
- ?線程不安全怎么能夠改寫成線程安全
無非有兩種策略:
- ?關于性能
通常來說,多線程是為了在同一時間內能夠處理更多的同樣類型的事情,但是線程不安全卻阻礙了我們達到我們的目的。所以,我們有的時候不得不想方設法的把線程不安全的函數改寫成線程安全的。
改寫的結果無非兩種,一種是原函數的“同步版本”,一種是原函數的“可重入版本”??芍厝氚姹鞠啾惹罢叩膹男阅苌蟻碚f有著天然的優勢,這種優勢就是在于它不涉及PV操作,不存在軟件上的瓶頸,可以最大化的利用硬件資源。然而“同步版本”則有可能不能充分利用硬件的資源,因為程序在等待資源的釋放。
- 關于重寫的策略
拿到一個線程不安全函數是一件郁悶的事情。但是有的時候你必須要使用它,那怎么辦呢?這個時候就要從上面提到的三個可能的共享數據來入手了:
轉載于:https://www.cnblogs.com/yzl050819/p/6811845.html
總結
- 上一篇: 【java排序】 归并排序算法、堆排序算
- 下一篇: 线程池,进程池