關於volatile變量

volatile是一個類型修飾符(type specifier)。它是被設計用來修飾被不同線程訪問和修改的變量。如果沒有volatile,基本上會導致這樣的結果:要麼無法編寫多線程程序,要麼編譯器失去大量優化的機會。volatile在英語裏是短瞬,不穩定,易揮發的意思

volatile變量告知編譯器,程序可能用不可見的方式改變變量,這些方式取決於具體實現。

何爲不可見呢,舉個例子:

所謂的不可見,是指編譯器不可預見.
具體實現包括中斷例程,多線程都可以改變變量的值.
舉個例子:
volatile int v;

void func()
{ int a,b;
  a=5*v;
  b=5*v;
  ....
}

如果v是個普通的變量,編譯器很可能會做這樣的優化,
第一次計算出5*v的值後,先賦給a,然後直接又從寄存賦給b,
而不會重新計算5*v.
如果定義成volatile,編譯器則不會做任何優化,每次都會
重新讀取v的值.


在執行a=5*v之後,有可能恰好在此時出現中斷,
將v的值改變,這時再執行b=5*v,結果應該是a和b的值不相同,
但如果編譯器按上面的規則一優化,則a和b永遠會相同,爲了
避免出現這種情況,於是將v定義成volatile的.


可能理解爲指示編譯器不對該變量做優化,而安全按照程序的寫法運行。


參考:http://baike.baidu.com/view/608706.htm

http://bbs.csdn.net/topics/60169778

發佈了22 篇原創文章 · 獲贊 9 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章