前言
volatitle是什麼?
volatile 的字面意思為「不穩定的,易變的」。它是被設計用來修飾被不同執行緒訪問和修改的變數,每次讀取變數都從變數的記憶體位址中訪問,防止變數更新不同步。
volatile為什麼用?
講乙個小例子:
int flag;全域性變數flag,可能隨時被中斷改變,如果不用volatile修飾,當調整編譯器優化級別時,可能此flag會被優化,導致使用的時候,使用暫存器內的值,而不是記憶體位址中的值,造成了flag值的變化不同步。所以debug時正常,優化燒寫後就不正常了。所以使用全域性變數的時候,盡量使用volatile進行修飾。interrupt isr_uart1(void
)main()
例如wiki百科中
volatile什麼時候使用?
1、中斷中改變的值
2、多工中,相互之間共享的值
3、儲存器對映的硬體暫存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義
const和volatile能同時使用,為什麼?
const表示本程式**層面上不能改變此變數,如果不小心手誤改變,編譯時應報錯。
volatile表示本程式外可能會改變此變數,編譯器不能優化掉。
例如:
const如果此程式中,沒有**給i賦值為1,則編譯器以可能會把if直接優化掉,但是這個i可能被其他地方修改(例如狀態暫存器)。volatile
int i = 0
;main()
總結:
由於有中斷、流水線執行模式(變數先從ram讀取到暫存器),多執行緒,這些資源共享的情況下,導致變數的改變和使用是併發的,而不是序列的(時間有先後,可一目了然的把控),所以變數存在著競爭
。volatile的作用,最終目的是為了讓程式設計師能夠準確的把控程式的執行,不會因為競爭,導致變數被意外改變,產生bug。
記得一句話,如果你都不知道自己的程式是如何執行的,就別先忙著除錯。
延伸知識:
1、什麼是記憶體和暫存器?有什麼關係?
2、什麼是原子操作?
參考資料:
2、詳解c中volatile關鍵字
3、多執行緒程式設計中什麼情況下需要加 volatile?
4、聊聊併發(五)——原子操作的實現原理
c volatile關鍵字解析
volatile提醒編譯器它後面所定義的變數隨時都有可能改變,因此編譯後的程式每次需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取資料。如果沒有volatile關鍵字,則編譯器可能優化讀取和儲存,可能暫時使用暫存器中的值,如果這個變數由別的程式更新了的話,將出現不一致的現象。下面舉例說明。在d...
C volatile關鍵字詳解
1 什麼是volatile volatile關鍵字是一種限定符用來宣告乙個物件在程式中可以被語句外的東西修改,比如作業系統 硬體或併發執行執行緒。遇到該關鍵字,編譯器不再對該變數的 進行優化,不再從暫存器中讀取變數的值,而是直接從它所在的記憶體中讀取值,即使它前面的指令剛剛從該處讀取過資料。而且讀取...
this關鍵字使用
一,表示類中屬性 1,沒有使用this的情況 class person public string getinfo public class thisdemo01 執行結果 姓名 null,年齡 0 可以得出結論 此時並沒有正確將內容賦給屬性 假設身邊有乙隻筆,遠處也有乙隻筆,肯定會就近拿身邊的筆。...