您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“C++中的volatile關鍵字怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C++中的volatile關鍵字怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
volatile是C語言的一個關鍵字,該關鍵字的作用是保持內存的可見性
例子:
我們對2號信號進行了捕捉,當該進程收到2號信號時會將全局變量flag由0置1, 也就是說,在進程收到2號信號之前,該進程會一直處于死循環狀態,直到收到2號信號時將flag置1才能夠正常退出
#include <stdio.h> #include <signal.h> int flag = 0; void handle(int signo) { printf("收到一個 %d號信號\n",signo); flag = 1; } int main() { signal(2,handle);//捕獲2號信號 while(!flag); printf("進程正常退出!\n"); return 0; }
上述代碼中:main函數和handler函數是兩個獨立的執行流
判斷一個數據為真為假 -> 邏輯運算 -> 需要CPU參與 ,常規情況下,需要從內存加載到CPU,然后CPU內部做判斷,然后再把結果返回
而while循環是在main函數當中的,編譯器發現:我們只對flag這個變量做檢測,而不做修改, 編譯器直接優化,把flag的值保存在寄存器中,直接在CPU檢測
此時main函數在檢測flag時只檢測寄存器里面的值,而handler執行流只是將內存中flag的值置為1了,那么此時就算進程收到2號信號也不會跳出死循環
檢驗:在編譯器優化級別較高的時候,就有可能將flag設置進寄存器里面
如何提高編譯時的優先級呢? 在編譯代碼時攜帶 -O3 選項使得編譯器的優化級別最高
此時再運行該代碼,就算向進程發生2號信號,該進程也不會終止
此時我們可以使用volatile關鍵字對flag變量進行修飾,告知編譯器,對flag變量的任何操作都必須真實的在內存中進行,即保持了內存的可見性
#include <stdio.h> #include <signal.h> volatile int flag = 0;//告知編譯器,對flag變量的任何操作都必須真實的在內存中進行 void handle(int signo) { printf("收到一個 %d號信號\n",signo); flag = 1; } int main() { signal(2,handle);//捕獲2號信號 while(!flag); printf("進程正常退出!\n"); return 0; }
此時就算我們編譯代碼時攜帶 -O3 選項,當進程收到2號信號將內存中的flag變量置1時,main函數執行流也能夠檢測到內存中flag變量的變化,進而跳出死循環正常退出
讀到這里,這篇“C++中的volatile關鍵字怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。