與關鍵字const一樣,關鍵字volatile也是乙個型別修飾符(type specifier)。
關於volatile的作用:
例如程式清單: volatile int m=10;
int k,n=m;
k=i;
volatile將告訴編譯器,整形變數m是隨時發生變化的,每次使用m的時候,都要求從m的位址中找出它當前的值,防止編譯器進行優化,而在某種情況下取得可能錯誤的值。也就是說,volatile可以阻止編譯器對這塊有關的**進行優化。
說到這裡,再詳細說一下是如何阻止的編譯器進行優化:如果編譯器在編譯時,發現兩次讀取m的值,並且在這兩次讀取之間的**沒有對m進行賦值等操作,編譯器會在第二次讀取m的時候,不去從m的位址中取值,而是沿用第一次的m的值,直接將其賦值給k。這樣以來,如果m是乙個暫存器變數或者表示乙個埠資料就容易出錯。
但是在加上關鍵字volatile後,就會阻止編譯器進行優化,保證了在每次使用m的時候都從位址記憶體上讀取。
建議使用關鍵字volatile的場合:
1、並行裝置的硬體暫存器。
2、乙個中斷服務子程式中會訪問到的非自動變數(如全域性變數)。
3、多執行緒應用中被幾個任務共享的變數。
關鍵字volatile在嵌入式開發(驅動程式)和linux核心**中經常出現。
volatile關鍵字 詳解
volatile 關鍵字 volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩定訪問。使用該關鍵字的例子如下 int volati...
詳解Volatile關鍵字
volatile應用場景 2.volatile 產生的原因 3.總結 4.深入理解volatile 編譯器優化 c關鍵字volatile memory破壞描述符 對於c編譯器來說,它並不知道這個值會被其他執行緒修改。自然就把它cache在暫存器裡面。記住,c 編譯器是沒有執行緒概念的!這時候就需要用...
volatile關鍵字詳解
可見性 意思就是說,在多執行緒環境下,某個共享變數如果被其中乙個執行緒給修改了,其他執行緒能夠立即知道這個共享變數已經被修改了,當其他執行緒要讀取這個變數的時候,最終會去記憶體中讀取,而不是從自己的工作空間中讀取。例如我們上面說的,當執行緒1對t進行了加1操作並把資料寫回到主存之後,執行緒2就會知道...