volatile 告訴編譯器:該變數值可能在程式不可見處被外部改變(硬體、中斷、其他執行緒),禁止優化,每次存取必須從記憶體實際讀寫,不可使用暫存器快取值。
volatile 不保證原子性,僅保證可見性)。const volatile:唯讀硬體暫存器(程式不修改,但硬體會更新)。volatile T *ptr:指標指向的資料易變(如 ISR 修改緩衝區指標)。volatile T *volatile ptr:指標本身與指向資料皆易變。int square(volatile int *p) {
return (*p) * (*p); // 編譯器生成兩次載入,中間值可能被改變
}
// 組合碼等價於:
int a = *p; int b = *p; return a * b; // a 與 b 可能不同!
int square(volatile int *p) {
int val = *p; // 單次讀取
return val * val;
}
#define READ(val, addr) (val = *(unsigned long*)addr) // 編譯器可能將 addr 值載入暫存器,後續 READ 直接用暫存器值 // 併發修改時導致讀到舊值 // 修正:volatile 修飾位址或變數 #define READ(val, addr) (val = *(volatile unsigned long*)addr)
volatile int x; x++; 非原子,多執行緒需 atomic 或鎖。__sync_synchronize(), atomic_thread_fence)。volatile 僅禁止編譯器優化相關讀寫,不禁止 CPU 亂序執行。stdatomic.h (C11) / pthread_mutex / __atomic 內建函式。volatile 變數立即存入區域變數,避免多次訪問。volatile 當作「神奇同步關鍵字」,理解其語義邊界。