volatile 意為「易揮發、易變」。修飾的變量告訴編譯器:每次訪問必須從內存/寄存器實際讀取,不要優化掉。
編譯器為提速會「偷懶」:
int a = 10;
int b = a; // 讀取 a
int c = a; // 編譯器可能直接用 10,不再讀內存
單線程下無害,但多線程、硬件寄存器、信號處理中,變量可能被外部修改,編譯器的緩存值就失效了。
volatile 保證可見性(注意:不保證原子性)。volatile sig_atomic_t flag; 在信號處理器中修改,主循環讀取。禮物打包好放自己房間(單線程),明天不拆封也知道裡面是啥。但若放在別人那裡(多線程/硬件),不敢保證沒被動過,每次都得拆開看(volatile 強制讀取)。
volatile 不提供線程同步,不保證原子操作,複雜場景仍需鎖/原子操作。作者 mr_raptor 的專欄