最近有看到一些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暫存器
留言列表