C語言關鍵字 – 專一王子:volatile

來源:互聯網
上載者:User

++++++++++++++++++++++++++++++++++++++++++

《C語言深入理解系列 - 專一王子:volatile》

查看其它博文請關注原創作者。

本文系本站原創,歡迎轉載! 轉載請註明出處:

http://blog.csdn.net/mr_raptor/article/details/7210434 

++++++++++++++++++++++++++++++++++++++++++

 

專一王子:volatile

描述:每個變數和他的名字一樣很善變,有時候它善變是發自內心的,有時是外部因素決定的,只有volatile變數才會表裡如一,因此獲得了專一王子的美譽。

作用:volatile字面意思是易揮發,易變化的意思,它修辭的變數表示該變數的值很容易由於外部因素髮生改變,強烈請求編譯器要老老實實的在每次對變數進行訪問時去記憶體裡讀取。可能上面說的還不是很清楚,我們換個例子來說,你明天一個朋友過生日,今天把要送的禮物打包好了,一般情況下,我們明天起來不再需要再開啟驗證一下裡面禮物是否存在,因為我們知道,只要禮物的外封裝沒有動過,裡面東西應該不會被動。其實編譯器和人一樣聰明,為了提高效率也會玩省事,如下面的例子:

1  int a = 10;

2  int b = a;

3  int c = a;

編譯器掃描了代碼發現上面,第一行代碼在將10賦給了整形變數a,之後a變數的值沒有再發生改變。在後面第二行中,將a變數裡的值取出來賦給b變數。在第三行代碼裡將a變數的值賦給c的時候,因為CPU訪問記憶體速度較慢(看register關鍵字介紹),編譯器為了提高效率,玩了“省事”,直接將10賦給了c。

單從上述代碼我們來看是沒有問題的,就如同從外封裝看生日禮物完好一樣。但是,上述代碼如果運行在多線程中,在一個線程上下文中沒有改變它的值,但是我們不能保證變數的值沒有被其它線程改變。就好比是,生日禮物放到其它人那裡儲存,我們不敢100%保證它裡面的東西還完好。當然這種資料不一致的機制不僅僅出現在多線程中,同樣在裝置的狀態寄存器裡也會存在。比如:網卡裡的某狀態寄存器裡的值是否為1表示是否有網路資料到達,在當前時刻其值為1,不能代表著下一時刻其值還為1,它的值是由外界條件決定的,編譯器肯定不能在這種情況下玩“省事”

為了防止在類似的情況下,編譯器玩省事,可以將這些變數聲明為volatile,這樣,不管它的值有沒有變化,每次對其值進行訪問時,都會從記憶體裡,寄存器裡讀取,從而保證資料的一致,做到表裡如一。

++++++++++++++++++++++++++++++++++++++++++

《C語言深入理解系列 - 專一王子:volatile》

查看其它博文請關注原創作者。

本文系本站原創,歡迎轉載! 轉載請註明出處:

http://blog.csdn.net/mr_raptor/article/details/7210434 

++++++++++++++++++++++++++++++++++++++++++

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.