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