加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶(hù)
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

volatile、atomic與中斷

2021/01/12
327
閱讀需 2 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

總結(jié):volatile 是強(qiáng)制 CPU 從內(nèi)存而不是 cache/ 寄存器讀取數(shù)據(jù),與多線(xiàn)程無(wú)關(guān),任何多線(xiàn)程資源競(jìng)爭(zhēng)都需要使用 std::atomic 解決。下面詳細(xì)分析。

volatile 有兩個(gè)作用:

1、防止編譯器 O2 級(jí)別優(yōu)化。編譯器判斷你的變量在某一段代碼內(nèi)沒(méi)有變化或者規(guī)律性變化,就會(huì)使用常數(shù)優(yōu)化,如:

            

         

for 循環(huán)可能被優(yōu)化成 a+= 1000,那么可能就不符合程序設(shè)計(jì)的預(yù)期。

2、變量在中斷、其它線(xiàn)程(線(xiàn)程跑在多核上,這樣 cache 內(nèi)容就可能不一致)、并行設(shè)備的寄存器等場(chǎng)景下需要穩(wěn)定訪(fǎng)問(wèn)。中斷服務(wù)程序中修改某個(gè)變量,參考上面的代碼,for 循環(huán)被中斷打斷并在中斷程序力里修改了變量 a 的值,編譯器是不知道的。在 c++11 之前,volatile 可以配合 barrier 內(nèi)存屏障保障變量的有序訪(fǎng)問(wèn),現(xiàn)在只需要使用 atomic 就行。

volatile 變量是可以被 const 修飾的,比如只讀的狀態(tài)寄存器,它是 volatile 因?yàn)樗赡鼙灰庀氩坏降馗淖?。它?const 因?yàn)槌绦虿粦?yīng)該試圖去修改它。另外 volatile 也可以修飾指針。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

機(jī)械轉(zhuǎn)行IT狗,目前在阿里巴巴淘寶事業(yè)群。日常記錄Linux應(yīng)用開(kāi)發(fā)、嵌入式操作系統(tǒng)、無(wú)線(xiàn)網(wǎng)絡(luò)協(xié)議棧。剛深入使用Java,跟大家一起入門(mén)交流。