你寫的程式,計算機並不是按照你寫的那樣去執行的。
源** -> 編譯器優化的重排 -> 指令並行可能會重排 -> 記憶體系統可能會重排 -> 執行
處理器在進行指令重排的時候,考慮,資料之間的依賴性!
指令重排 不會造成影響的例子
int x =1;
//1int y =2;
//2x = x +5;
//3y = x * x;
//4我們所期望的: 1234 執行的時候可能會變成 2134
1324
但是不可能是 4321
指令重排 可能造成影響的例子 : abxy預設值都是0執行緒a
執行緒bx=a
y=bb=1
a=2正常的結果: x=0 y=0
執行緒a執行緒b
b=1a=2
x=ay=b
指令重排導致的異常結果 :x=2 y=2
記憶體屏障 cpu指令 作用:
1.保證特定的操作的執行順序!
2.保證某些變數的記憶體可見性(利用這些特性volatile實現了可見性)
Volatile禁止指令重排序(三)
計算機在執行程式時,為了提高效能,編譯器和處理器常常會對指令重排,一般分為以下三種 源 編譯器優化的重排 指令並行的重排 記憶體系統的重排 最終執行指令單執行緒環境裡面確保最終執行結果和 順序的結果一致 處理器在進行重排序時,必須要考慮指令之間的資料依賴性 多執行緒環境中線程交替執行,由於編譯器優化...
volatile的指令重排細節
volatile禁止重排優化 volatile關鍵字另乙個作用就是禁止指令重排優化,從而避免多執行緒環境下程式出現亂序執行的現象,關於指令重排優化前面已詳細分析過,這裡主要簡單說明一下volatile是如何實現禁止指令重排優化的。先了解乙個概念,記憶體屏障 memory barrier 記憶體屏障,...
volatile修飾符 記憶體可見性 禁止重排
volatile是乙個能保證變數的記憶體可見性,且禁止重排的修飾符 volatile通過設立4個記憶體屏障避免處理器的重排序 volatile可以作為乙個鎖使用 用於多執行緒同步 volatile能保證變數的記憶體可見性。翻譯成大白話 被volatile修飾過的變數v,具有以下特點 只要嘗試讀取v,...