91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中的volatile關鍵字怎么使用

發布時間:2023-04-19 11:37:55 來源:億速云 閱讀:86 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“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;
}

C++中的volatile關鍵字怎么使用

上述代碼中:main函數和handler函數是兩個獨立的執行流

判斷一個數據為真為假 -> 邏輯運算 -> 需要CPU參與 ,常規情況下,需要從內存加載到CPU,然后CPU內部做判斷,然后再把結果返回

而while循環是在main函數當中的,編譯器發現:我們只對flag這個變量做檢測,而不做修改, 編譯器直接優化,把flag的值保存在寄存器中,直接在CPU檢測

C++中的volatile關鍵字怎么使用

此時main函數在檢測flag時只檢測寄存器里面的值,而handler執行流只是將內存中flag的值置為1了,那么此時就算進程收到2號信號也不會跳出死循環

檢驗:在編譯器優化級別較高的時候,就有可能將flag設置進寄存器里面

如何提高編譯時的優先級呢? 在編譯代碼時攜帶 -O3 選項使得編譯器的優化級別最高 

C++中的volatile關鍵字怎么使用

此時再運行該代碼,就算向進程發生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關鍵字怎么使用

讀到這里,這篇“C++中的volatile關鍵字怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沁水县| 英德市| 莲花县| 贵溪市| 武强县| 潮州市| 华阴市| 安康市| 九龙县| 琼结县| 锦屏县| 上蔡县| 瑞安市| 涟水县| 江川县| 浮梁县| 合作市| 信阳市| 高邑县| 无棣县| 达日县| 莱阳市| 阳江市| 长治市| 灵宝市| 石泉县| 观塘区| 民县| 连城县| 康定县| 商洛市| 泗洪县| 霍山县| 三台县| 枝江市| 永福县| 进贤县| 利辛县| 曲周县| 沙雅县| 盈江县|