正文
在嵌入式軟件開發(fā)過程中,如果對volatile不熟,那可以你應(yīng)該是個(gè)"假嵌入式程序員",因?yàn)橐粋€(gè)變量需不需要使用volatile考慮的場景挺多的,如果在某些場景下亂用,會(huì)影響程序運(yùn)行效率,有時(shí)候忘記加甚至?xí)沟贸绦虬l(fā)生異常,那么bug菌今天就大家好好聊聊這個(gè)C語言關(guān)鍵字:
1
傳統(tǒng)定義
volatile直譯為“易變的”,也就是告訴編譯器這個(gè)變量隨時(shí)都可能發(fā)生變化,編譯器你跟我“特殊照顧一下“。
那么編譯器通常會(huì)怎么去處理使用volatile修飾的變量呢?
對于C變量都是代表著對應(yīng)的內(nèi)存,讀取使用volatile修飾的變量,會(huì)直接從其所對應(yīng)的內(nèi)存地址中獲取最新的數(shù)據(jù),否則,編譯器會(huì)對其訪問進(jìn)行優(yōu)化,比如直接從緩存中讀取副本、或者是從寄存器中讀取副本。
這樣就可能會(huì)導(dǎo)致數(shù)據(jù)更新不一致的問題。
2
最常用的地方
從前面對volatile的功能描述,我們可以知道volatile最常用于那些與硬件外設(shè)寄存器打交道的地址,這樣確保每次對寄存器的讀取都是從內(nèi)存中獲取的最新值,比如:
再比如下圖所示,如果我們向地址0x812100地址連續(xù)改變其值:
那么編譯器通常會(huì)將其直接優(yōu)化為第三條操作,并不會(huì)去執(zhí)行前兩條操作,這樣會(huì)造成寫寄存器時(shí)序上的問題。
如果采用volatile去修飾,則三條命令便會(huì)依次執(zhí)行,達(dá)到我們代碼所示三次操作的目的。
3
更復(fù)雜一點(diǎn)的,也是最重要的
其實(shí)對于volatile所解決的問題用更加專業(yè)的說法可以分為:可見性和有序性。
1、可見性
所謂可見性,通常是在多線程訪問共享數(shù)據(jù)的情況,當(dāng)一個(gè)線程對共享變量進(jìn)行修改,而其他線程能否立即觀察到這個(gè)修改的性質(zhì)。
在我們目前大部分單核一級緩存的CPU無需考慮這個(gè)問題,而對于現(xiàn)場多核多級緩存處理器,各個(gè)現(xiàn)場都會(huì)維護(hù)著自己的緩存,如果僅僅只是更新到了自己的緩存中那么其他線程是無法立馬感受到這個(gè)修改的,最終導(dǎo)致結(jié)果不一致。
2、有序性
很多時(shí)候也叫作重排序,說白了就是對執(zhí)行指令進(jìn)行了執(zhí)行順序上的優(yōu)化,以不改變指令運(yùn)行的最終結(jié)果,而改變指令的執(zhí)行順序。
編譯器可以調(diào)整指令,同樣處理器的多級流水線和亂序執(zhí)行也同樣可以改變指令執(zhí)行順序;甚至為了多級緩存的高效執(zhí)行,也同樣會(huì)對內(nèi)存讀寫操作進(jìn)行重排序。
然而這樣的重排序,卻會(huì)對多線程并發(fā)訪問共享數(shù)據(jù)的過程中產(chǎn)生問題,從而不符合我們編程源碼的預(yù)期執(zhí)行順序。
但對于volatile只能在一定程度上防止指令重排序,其只能保證單個(gè)變量訪問的有序性,而不能保證整個(gè)程序的有序性,所以這一點(diǎn)是大家尤為要注意的。
所以講了這么多,相信以后大家再開發(fā)中也都會(huì)遇到。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5394瀏覽量
122374 -
C語言
+關(guān)注
關(guān)注
180文章
7623瀏覽量
139336 -
嵌入式軟件
+關(guān)注
關(guān)注
4文章
244瀏覽量
27009 -
volatile
+關(guān)注
關(guān)注
0文章
46瀏覽量
13191
原文標(biāo)題:這個(gè)變量要不要用volatile修飾呢?
文章出處:【微信號:最后一個(gè)bug,微信公眾號:最后一個(gè)bug】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
volatile 釋義
【原創(chuàng)分享】單片機(jī)編程關(guān)鍵字之volatile
volatile關(guān)鍵字應(yīng)用場景及示例
編譯器之位域和volatile研究
C語言中的volatile關(guān)鍵字
Volatile與多線程的認(rèn)識(shí)與理解
volatile變量定義的意義和該用在哪里

C語言類型修飾符Volatile的使用說明
WIN和AVR及AVR-GCC中如何使用volatile的詳細(xì)資料概述

關(guān)于volatile關(guān)鍵字對編譯器優(yōu)化的影響
如何使用C++語法中的volatile
C++基礎(chǔ)語法之volatile、assert()和sizeof()
漫談C變量——優(yōu)化天敵“volatile”

評論