C/C++中的volatile究竟是什麽鬼?
volatile是C/C++中的一個關鍵字,將變量或對象聲明為volatile類型後,每次對變量的訪問都是從其內存直接讀取。那什麽時候對變量的訪問不是從其內存讀取的呢?一種常見的情況就是編譯器開啟了優化選項,這時候對變量的訪問有可能就是從寄存器中讀取。
volatile是C/C++中的關鍵字,所以它是在多線程概念之前出現的,但要解釋volatile的作用的話,如果我們不是搞嵌入式硬件開發的,那麽在一個多線程程序的示例裏對volatile的功能進行解釋是最常見的,這就有點尷尬了- -! 比如以下是一個線程執行的函數,如果編譯器開啟了優化選項的話那麽對於g_flag的訪問都是從CPU寄存器中讀取的,另一個線程如果g_flag修改為false的話這裏的線程也不會退出,因為這裏是從CPU寄存器中讀取的值,而不是從g_flag的內存上讀取到的值!
void ThreadFun()
{
while(g_flag == true);
do();
}
我想C/C++編譯器默認應該是不開啟這種惡心的優化選項的,否則所有的共享數據都應該聲明為volatile了。當然如果你的代碼是開源的,你不知道別人的編譯器有沒有開啟這個優化,為了保證安全性那麽全局數據應該被聲明為volatile。
最後總結一下,volatile是用來設置變量或對象值的讀取方式為從內存讀取,它與線程同步是兩碼事,主要用在下面的情況上:
1、變量可能會被本程序之外的東西修改,如其它程序,操作系統、硬件操作。
2、變量可能會被另一個線程修改,而且編譯器開啟了優化選項。
參考:《win32多線程程序設計》、《windows核心編程》、知乎:多線程編程中什麽情況下需要加 volatile? 、知乎:C++多線程有必要加volatile麽?
C/C++中的volatile究竟是什麽鬼?