volatile关键字的使用
生活随笔
收集整理的這篇文章主要介紹了
volatile关键字的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
volatile變量直接在CPU和內存之間交換,不通過一級、二級緩存。 考慮下面的代碼: 代碼:
上面代碼中Gadget::Wait的目的是每過一秒鐘去檢查一下flag_成員變量,當flag_被另一個線程設為true時,該函數才會返回。至少這是程序作者的意圖,然而,這個Wait函數是錯誤的。 ????? 假設編譯器發現Sleep(1000)是調用一個外部的庫函數,它不會改變成員變量flag_,那么編譯器就可以斷定它可以把flag_緩存在寄存器中,以后可以訪問該寄存器來代替訪問較慢的主板上的內存。這對于單線程代碼來說是一個很好的優化,但是在現在這種情況下,它破壞了程序的正確性:當你調用了某個Gadget的Wait函數后,即使另一個線程調用了Wakeup,Wait還是會一直循環下去。這是因為flag_的改變沒有反映到緩存它的寄存器中去。編譯器的優化未免有點太……樂觀了。 ????? 在大多數情況下,把變量緩存在寄存器中是一個非常有價值的優化方法,如果不用的話很可惜。C和C++給你提供了顯式禁用這種緩存優化的機會。如果你聲明變量是使用了volatile修飾符,編譯器就不會把這個變量緩存在寄存器里——每次訪問都將去存取變量在內存中的實際位置。這樣你要對Gadget的Wait/Wakeup做的修改就是給flag_加上正確的修飾:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Gadget { public: ????void Wait() ????{ ????????while (!flag_) ????????{ ????????????Sleep(1000); // sleeps for 1000 milliseconds ????????} ????} void Wakeup() { ????flag_ = true; } //... private: ????bool flag_; }; |
| 1 2 3 4 5 6 7 | class Gadget { public: ????//... as above ... private: ????volatile bool flag_; }; |
轉載于:https://www.cnblogs.com/duyy/p/3666442.html
總結
以上是生活随笔為你收集整理的volatile关键字的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工具DebugView、PCHunter
- 下一篇: web 日志分析工具 awstats 简