volatile關鍵字的原理,作用,使用

2021-10-24 23:26:32 字數 1428 閱讀 2240

1,可以使得在多處理器環境下保證了共享變數的可見性。

2,禁止指令重排序優化

什麼是可見性呢?

在多執行緒環境下,讀和寫發生在不同的執行緒中的時候,可能會出現:讀執行緒不能及時的讀取到其他執行緒寫入的最新的值。這就是所謂的可見性。

volatile 關鍵字是如何保證可見性的?

使用【hsdis】這個工具,檢視lock彙編指令,在多處理器環境下,lock 彙編指令可以基於匯流排鎖或者快取鎖的機制來達到可見性的乙個效果。

可見性的本質總結:

由於 cpu 快取記憶體的出現使得 如果多個 cpu 同時快取了相同的共享資料時,可能存在可見性問題。也就是 cpu0 修改了自己本地快取的值對於 cpu1 不可見。不可見導致的後果是 cpu1 後續在對該資料進行寫入操作時,是使用的髒資料。使得資料最終的結果不可**。 所以要使用volatile關鍵字來解決這個不可見的問題。

快取一致性

當提出cpu的告訴快取問題,就會引出快取一致性問題。

那麼什麼是快取一致性問題呢?有了快取記憶體的存在以後,每個 cpu 的處理過程是,先將計算需要用到的資料快取在 cpu 快取記憶體中,在 cpu進行計算時,直接從快取記憶體中讀取資料並且在計算完成之後寫入到快取中。在整個運算過程完成後,再把快取中的資料同步到主記憶體。由於在多 cpu 種,每個執行緒可能會執行在不同的 cpu 內,並且每個執行緒擁有自己的快取記憶體。同乙份資料可能會被快取到多個 cpu 中,如果在不同 cpu 中執行的不同執行緒看到同乙份記憶體的快取值不一樣就會存在快取不一致的問題。

解決快取不一致的問題解決方案

匯流排鎖快取鎖

匯流排鎖,簡單來說就是,在多 cpu 下,當其中乙個處理器要對共享記憶體進行操作的時候,在匯流排上發出乙個 lock#訊號,這個訊號使得其他處理器無法通過匯流排來訪問到共享記憶體中的資料,匯流排鎖定把 cpu 和記憶體之間的通訊鎖住了,這使得鎖定期間,其他處理器不能操作其他記憶體位址的資料,所以匯流排鎖定的開銷比較大,這種機制顯然是不合適的。

如何優化呢?最好的方法就是控制鎖的保護粒度,我們只需要保證對於被多個 cpu 快取的同乙份資料是一致的就行。所以引入了快取鎖,它核心機制是基於快取一致性協議來實現的。

什麼是指令重排序

是指cpu採用了允許將多條指令不按程式規定的順序分開發送給各相應電路單元處理。

那麼禁止指令重排序就相當於乙個記憶體屏障,(記憶體屏障的作用可以通過防止 cpu 對記憶體的亂序訪問來保證共享資料在多執行緒並行執行下的可見性

但是這個屏障怎麼來加呢?回到最開始我們講 volatile 關鍵字的**,這個關鍵字會生成乙個 lock 的彙編指令,這個指令其實就相當於實現了一種記憶體屏障。

Volatile關鍵字實現原理

volatile作用 讓其他執行緒能夠馬上感知到某一線程多某個變數的修改 對共享變數的修改,其他的執行緒馬上能感知到 不能保證原子性 讀 寫 i 重排序 編譯階段 指令優化階段 輸入程式的 順序並不是實際執行的順序 重排序後對單執行緒沒有影響,對多執行緒有影響 volatile volatile規則...

關鍵字 volatile關鍵字的作用

1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...

volatile關鍵字的原理與使用

1 原子性 定義 即乙個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。2 可見性 定義 指當多個執行緒訪問同乙個變數時,乙個執行緒修改了這個變數的值,其他執行緒能夠立即看得到修改的值。3 有序性 定義 即程式執行的順序按照 的先後順序執行。a.當寫乙個volatil...