它是被設計用來修飾被不一樣線程訪問和修改的變量。若是沒有volatile,基本上會致使這樣的結果:要麼沒法編寫多線程程序,要麼編譯器失去大量優化的機會。多線程
volatile的語法和const是同樣的。可是volatile的意思是:「在編譯器認識的範圍外,這個數據能夠改變」。不知何故,環境正在改變數據(可能經過多任務、多線程或者中斷處理),因此,volatile告訴編譯器不要擅自做出有關該數據的任何假定,優化期間尤爲如此。ide
就行創建const對象同樣,程序猿也能夠創建volatile對象,甚至還能夠創建const volatile對象,這個對象不能被客戶程序猿改變。可是,能夠經過外部的代理程序改變。函數
#include "stdafx.h" class Comm { const volatile unsigned char byte; volatile unsigned char flag; enum { bufsize = 100 }; unsigned char buf[bufsize]; int index; public: Comm(); void isr() volatile; char read(int index) const; }; Comm::Comm(): index(0), byte(0), flag(0) { } void Comm::isr() volatile { flag = 0; buf[index++] = byte; if(index >= bufsize) index = 0; } char Comm::read(int index) const { if(index<0 || index>= bufsize) return 0; return buf[index]; } int _tmain(int argc, _TCHAR* argv[]) { volatile Comm port; port.isr();// OK //port.read(0); //Error read() not volatile return 0; }
就像const 同樣,咱們能夠對數據成員和函數成員和對象自己使用volatile,能夠對volatile對象調用volitile函數。優化
問題:1). 一個參數既能夠是const還能夠是volatile嗎?解釋爲何。線程
int square(volatile int *ptr) { return *ptr * *ptr; }
int square(volatile int *ptr) { int a,b; a = *ptr; b = *ptr; return a * b; }
因爲*ptr的值可能在兩次取值語句之間發生改變,所以a和b多是不一樣的。結果,這段代碼可能返不是你所指望的平方值!正確的代碼以下:設計
long square(volatile int *ptr) { int a; a = *ptr; return a * a; }