多線程學習一 可見性、原子性和有序性

可見性

在單核時代,所有的緩存都操作同一個cup上的緩存,所以可見性很容易解決。當a線程更新了緩存上的變量,那麼在b線程去訪問該變量的時候,拿到的一定是最新值。

在多核時代,每個cup都有自己的緩存區,當不同cup上的線程去訪問內存中的同個變量時,假設該變量在cup中都有緩存。那麼不同cup上的線程對變量的修改不會立馬同步到內存中,導致不同cup的緩存中的同一個變量對另外cup沒有可見性,這個就屬於硬件程序員給軟件程序員挖的“坑。

原子性

操作系統允許某個進程執行一小段時間,例如 50 毫秒,過50毫秒就會執行其他任務,這個過程叫任務切換,50毫秒我們就叫時間片。

原子性我們指的是把一個操作或者多個操作在cup上的執行不被中斷,我們稱爲原子性。cup能保證的原子性,是cup上的指令,而不是高級語言指令。

有序性

編譯器爲了優化執行效率,會在不改變程序結果的前提下優化程序執行指令。

一般情況下不會有問題,但是在有些問題下,會導致一些難預見的問題。

 

課後筆記:32位的操作系統執行long類型的操作時,因爲long類型超過了32位的單個空間,所以對long類型的操作是分成多次操作的,這些導致一些原子性的問題。

 

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