1.volatile有什么用呢?
volatile,只一個變量可能隨時由于外界地變化而變化
例如有兩個線程分別是線程1和線程2
一個全局變量volatile int i = 0;
線程1
執行如下代碼
while(i == 0);
printf();
假設線程1執行到 while處,就會反復執行上這條語句
此時線程2執行
i = 1;
線程1就會執行 printf()
若沒有指定 int i 為 volatile
則當線程2執行 i = 1;
時,線程1仍然繼續執行while語句
也就是說線程1沒有感知變量i的變化
這是由于編譯器會對代碼進行優化,以及將i
變量裝入寄存器的原因,當i再內存中的值發生變化時
無法判斷在那個寄存器中有該變量的拷貝,而且不能
同步更新該拷貝
因此需要說明該變量為volatile
這樣,編譯器不會將該變量裝入寄存器,而且不會對
涉及該變量的操作進行優化.
下面有個更理論性的解釋:
volatile總是與優化有關,編譯器有一種技術叫做數據流分析,分析程序中的變量在哪里賦值、在哪里使用、在哪里失效,分析結果可以用于常量合并,常
量傳播等優化,進一步可以死代碼消除。但有時這些優化不是程序所需要的,這時可以用volatile關鍵字禁止做這些優化,volatile的字面含義是
易變的,它有下面的作用:
1 不會在兩個操作之間把volatile變量緩存在寄存器中。在多任務、中斷、甚至setjmp環境下,變量可能被其他的程序改變,編譯器 自己無法知道,volatile就是告訴編譯器這種情況。
2 不做常量合并、常量傳播等優化,所以像下面的代碼:
volatile int i = 1;
if (i > 0) ...
if的條件不會當作無條件真。
3 對volatile變量的讀寫不會被優化掉。如果你對一個變量賦值但后面沒用到,編譯器常常可以省略那個賦值操作,然而對Memory Mapped IO的處理是不能這樣優化的。
前面有人說volatile可以保證對內存操作的原子性,這種說法不大準確,其一,x86需要LOCK前綴才能在SMP下保證原子性,其二,RISC根本不能對內存直接運算,要保證原子性得用別的方法,如atomic_inc。
對于jiffies,它已經聲明為volatile變量,我認為直接用jiffies++就可以了,沒必要用那種復雜的形式,因為那樣也不能保證原子性。
你可能不知道在Pentium及后續CPU中,下面兩組指令
inc jiffies
;;
mov jiffies, %eax
inc %eax
mov %eax, jiffies
作用相同,但一條指令反而不如三條指令快。
posted on 2010-02-03 09:16
chatler 閱讀(201)
評論(0) 編輯 收藏 引用 所屬分類:
C++_BASIS