我終於也碰到volatile這個問題了

來源:互聯網
上載者:User

以前上ARM課,老師講到volatile這個關鍵字時,主要是說他用到更硬體相關的地方。比如我們看到很多關於硬體的標頭檔的時候,寄存器的定義都是幾乎都是volatile與記憶體位址相結合,因為我們時刻想要的是寄存器的最新值,而volatile這個關鍵字的作用就是告訴編譯器不要對它聲明的變數進行最佳化,每次讀取操作都要獲得它的最新值。


以上就是我在遇到volatile新的問題之前對於volatile的理解,認為它一般就是用在與硬體相關的地方,其他需要用到的地方不知道在哪裡。直到我昨天遇到了關於volatile的新問題。


我遇到的問題是這樣的,我用到了定時器來實現精確的延時,為了判斷時間到而繼續進行運行下面的語句,我聲明了一個全域變數來表明定時時間是否到,中斷函數裡我就將這個標誌置位,表示時間到達。在用到定時器的函數裡,我就用while(!flag);這樣的語句來判斷定時時間是否到,但我運行偵錯工具時,程式執行了中斷,但是程式就一直停止在while(!flag);這裡不往下執行了。想了好久,我也不知道為什麼。最後可能是靈感還是什麼的,我無意在全域變數flag前面加了個volatile關鍵字,奇蹟發生了,程式終於順利運行起來了。看來,volatile還在其他的地方有用處。最後,我在網上搜了關於voatile的用法,其中果然就有我面臨到的問題。


現在簡單總結一下volatile的用法。

它主要用到變數會非同步改變的時候,主要表現在一下3個方面:

1.CPU外設寄存器 (我開始一直理解的volatile用法)

2.中斷和主迴圈都會用到的全域變數 (這就是我遇到的問題啦)

3. 作業系統中的線程間都會用到的公開變數 (暫時沒有遇到,不過記下了)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.