volatile的作用
volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性;使用volatile指每次從內存中讀取數據,而不是從編譯器優化后的緩存中讀取數據,簡單來講就是防止編譯器優化。
在單任務環境中,如果在兩次讀取變量之間不改變變量的值,編譯器就會發生優化,會將RAM中的值賦值到寄存器中;由於訪問寄存器的效率要高於RAM,所以在需要讀取變量時,直接寄存器中獲取變量的值,而不是從RAM中。
在多任務環境中,雖然在兩次讀取變量之間不改變變量的值,在一些情況下變量的值還是會發生改變,比如在發生中斷程序或者有其他的線程。這時候如果編譯器優化,依舊從寄存器中獲取變量的值,修改的值就得不到及時的響應(在RAM還未將新的值賦值給寄存器,就已經獲取到寄存器的值)。
要想防止編譯器優化,就需要在聲明變量時加volatile關鍵字,加關鍵字后,就在RAM中讀取變量的值,而不是直接在寄存器中取值。