通常說來,volatile用在以下的幾個地方:
一、
中斷服務程序中修改的供其它程序檢測的變量須要加volatile;
二、多任務環境下各任務間共享的標誌應該加volatile;
三、
存儲器映射的硬件寄存器一般也要加volatile說明,由於每次對它的讀寫均可能有不一樣意義;
另外,以上這幾種狀況常常還要同時考慮數據的完整性(相互關聯的幾個標誌讀了一半被打斷了重寫),在1中能夠經過關中斷來實現,2 中能夠禁止任務調度,3中則只能依靠硬件的良好設計了。
典型的例子
1
|
for ( int i=0; i<100000; i++);
|
這個語句用來測試空循環的速度的
若是你寫成
1
|
for ( volatile int i=0; i<100000; i++);
|
它就會執行了
volatile對應的變量可能在你的程序自己不知道的狀況下發生改變
好比多線程的程序,共同訪問的內存當中,多個程序均可以操縱這個變量
你本身的程序,是沒法斷定什麼時候這個變量會發生變化
還好比,他和一個外部設備的某個狀態對應,當外部設備發生操做的時候,經過驅動程序和中斷事件,系統改變了這個變量的數值,而你的程序並不知道。
對於volatile類型的變量,系統每次用到他的時候都是直接從對應的內存當中提取,而不會利用cache當中的原有數值,以適應它的未知什麼時候會發生的變化,系統對這種變量的處理不會作優化——顯然也是由於它的數值隨時均可能變化的狀況。