溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C++中的volatile關(guān)鍵字怎么使用

發(fā)布時(shí)間:2023-04-19 11:37:55 來(lái)源:億速云 閱讀:75 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“C++中的volatile關(guān)鍵字怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“C++中的volatile關(guān)鍵字怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

volatile是C語(yǔ)言的一個(gè)關(guān)鍵字,該關(guān)鍵字的作用是保持內(nèi)存的可見(jiàn)性

例子:

我們對(duì)2號(hào)信號(hào)進(jìn)行了捕捉,當(dāng)該進(jìn)程收到2號(hào)信號(hào)時(shí)會(huì)將全局變量flag由0置1, 也就是說(shuō),在進(jìn)程收到2號(hào)信號(hào)之前,該進(jìn)程會(huì)一直處于死循環(huán)狀態(tài),直到收到2號(hào)信號(hào)時(shí)將flag置1才能夠正常退出

#include <stdio.h>
#include <signal.h>
int flag = 0;
void handle(int signo)
{
	printf("收到一個(gè) %d號(hào)信號(hào)\n",signo);
	flag = 1;
}
int main()
{
	signal(2,handle);//捕獲2號(hào)信號(hào)
	while(!flag);
	printf("進(jìn)程正常退出!\n");
	return 0;
}

C++中的volatile關(guān)鍵字怎么使用

上述代碼中:main函數(shù)和handler函數(shù)是兩個(gè)獨(dú)立的執(zhí)行流

判斷一個(gè)數(shù)據(jù)為真為假 -> 邏輯運(yùn)算 -> 需要CPU參與 ,常規(guī)情況下,需要從內(nèi)存加載到CPU,然后CPU內(nèi)部做判斷,然后再把結(jié)果返回

而while循環(huán)是在main函數(shù)當(dāng)中的,編譯器發(fā)現(xiàn):我們只對(duì)flag這個(gè)變量做檢測(cè),而不做修改, 編譯器直接優(yōu)化,把flag的值保存在寄存器中,直接在CPU檢測(cè)

C++中的volatile關(guān)鍵字怎么使用

此時(shí)main函數(shù)在檢測(cè)flag時(shí)只檢測(cè)寄存器里面的值,而handler執(zhí)行流只是將內(nèi)存中flag的值置為1了,那么此時(shí)就算進(jìn)程收到2號(hào)信號(hào)也不會(huì)跳出死循環(huán)

檢驗(yàn):在編譯器優(yōu)化級(jí)別較高的時(shí)候,就有可能將flag設(shè)置進(jìn)寄存器里面

如何提高編譯時(shí)的優(yōu)先級(jí)呢? 在編譯代碼時(shí)攜帶 -O3 選項(xiàng)使得編譯器的優(yōu)化級(jí)別最高 

C++中的volatile關(guān)鍵字怎么使用

此時(shí)再運(yùn)行該代碼,就算向進(jìn)程發(fā)生2號(hào)信號(hào),該進(jìn)程也不會(huì)終止

此時(shí)我們可以使用volatile關(guān)鍵字對(duì)flag變量進(jìn)行修飾,告知編譯器,對(duì)flag變量的任何操作都必須真實(shí)的在內(nèi)存中進(jìn)行,即保持了內(nèi)存的可見(jiàn)性

#include <stdio.h>
#include <signal.h>
volatile int flag = 0;//告知編譯器,對(duì)flag變量的任何操作都必須真實(shí)的在內(nèi)存中進(jìn)行
void handle(int signo)
{
	printf("收到一個(gè) %d號(hào)信號(hào)\n",signo);
	flag = 1;
}
int main()
{
	signal(2,handle);//捕獲2號(hào)信號(hào)
	while(!flag);
	printf("進(jìn)程正常退出!\n");
	return 0;
}

此時(shí)就算我們編譯代碼時(shí)攜帶 -O3 選項(xiàng),當(dāng)進(jìn)程收到2號(hào)信號(hào)將內(nèi)存中的flag變量置1時(shí),main函數(shù)執(zhí)行流也能夠檢測(cè)到內(nèi)存中flag變量的變化,進(jìn)而跳出死循環(huán)正常退出

C++中的volatile關(guān)鍵字怎么使用

讀到這里,這篇“C++中的volatile關(guān)鍵字怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI