最近有看到一些code定義volatile實在有看沒有懂,看到這篇又有跟別人討論

看到這位作者寫的最詳細 轉貼至

https://swwuyam.tian.yam.com/posts/12637559


volatile 為一關鍵字 加在變數的前面
被 volatile 宣告的變數 將不會使用最佳化編譯
有時一個變數的值改變了 compiler 並不會馬上將他寫入記憶體中
而會先把結果放在CPU暫存器中 等到處理結束之後 才寫入記憶體
若說這個變數是多執行緒的flag 其他的執行緒要透過這個變數來反應
而這個值卻又沒有寫入記憶體 這時便會發生意想不到的結果

又或者是這變數為一個硬體的暫存器 會被硬體所改變
然而compiler 並沒有正確的將值從硬體暫存器取出來 
而是將自己暫存的值拿來使用
這種情況 就是要用volatile 來宣告變數 告訴compiler不要自己暫存變數來提升速度
如此這個變數有任何的改變 便會馬上反應出來 


另外參考

http://magicjackting.pixnet.net/blog/post/71949519-c-語言:關於變數的二三事

 

 

自己講解

看圖最快

A記憶體為硬體的記憶體,

當程式執行時候,有些記憶體經過編譯器編譯後,會暫存CPU暫存記憶體中(B),

然而,程式執行時優先取得B區的暫存器的值

意思是B區有個test變數=1,A區也有一個test=1

但如果有天A區的暫存值test改變了,B區的test CPU暫存器沒有隨著編譯器更新,

就會造成程式錯誤,

若使用volatile,

程式就會永遠都從(A)記憶區塊中取得test變數

不會對test編出一個位置在B區,也不會去取得B區塊的CPU暫存器

 

 

 

文章標籤
創作者介紹
創作者 阿倫 的頭像
阿倫

不會的就放這邊

阿倫 發表在 痞客邦 留言(0) 人氣()