程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言關鍵字 - 專一王子:Volatile

C語言關鍵字 - 專一王子:Volatile

編輯:關於C語言

專一王子:volatile
描述:每個變量和他的名字一樣很善變,有時候它善變是發自內心的,有時是外部因素決定的,只有volatile變量才會表裡如一,因此獲得了專一王子的美譽。
作用:volatile字面意思是易揮發,易變化的意思,它修辭的變量表示該變量的值很容易由於外部因素發生改變,強烈請求編譯器要老老實實的在每次對變量進行訪問時去內存裡讀取。可能上面說的還不是很清楚,我們換個例子來說,你明天一個朋友過生日,今天把要送的禮物打包好了,一般情況下,我們明天起來不再需要再打開驗證一下裡面禮物是否存在,因為我們知道,只要禮物的外包裝沒有動過,裡面東西應該不會被動。其實編譯器和人一樣聰明,為了提高效率也會玩省事,如下面的例子:
1  int a = 10;
2  int b = a;
3  int c = a;
www.2cto.com
編譯器掃描了代碼發現上面,第一行代碼在將10賦給了整形變量a,之後a變量的值沒有再發生改變。在後面第二行中,將a變量裡的值取出來賦給b變量。在第三行代碼裡將a變量的值賦給c的時候,因為CPU訪問內存速度較慢(看register關鍵字介紹),編譯器為了提高效率,玩了“省事”,直接將10賦給了c。
單從上述代碼我們來看是沒有問題的,就如同從外包裝看生日禮物完好一樣。但是,上述代碼如果運行在多線程中,在一個線程上下文中沒有改變它的值,但是我們不能保證變量的值沒有被其它線程改變。就好比是,生日禮物放到其它人那裡保存,我們不敢100%保證它裡面的東西還完好。當然這種數據不一致的機制不僅僅出現在多線程中,同樣在設備的狀態寄存器裡也會存在。比如:網卡裡的某狀態寄存器裡的值是否為1表示是否有網絡數據到達,在當前時刻其值為1,不能代表著下一時刻其值還為1,它的值是由外界條件決定的,編譯器肯定不能在這種情況下玩“省事”
為了防止在類似的情況下,編譯器玩省事,可以將這些變量聲明為volatile,這樣,不管它的值有沒有變化,每次對其值進行訪問時,都會從內存裡,寄存器裡讀取,從而保證數據的一致,做到表裡如一。

作者 mr_raptor的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved