C++中的volatile關(guān)鍵字及其作用
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; }
上述代碼中: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è)
此時(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í)別最高
此時(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)正常退出
到此這篇關(guān)于C++中的volatile關(guān)鍵字及其作用的文章就介紹到這了,更多相關(guān)C++ volatile關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
string中c_str(),data(),copy(p,n)函數(shù)的用法總結(jié)
以下是對(duì)string中c_str(),data(),copy(p,n)函數(shù)的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09詳細(xì)分析c++ const 指針與指向const的指針
這篇文章主要介紹了c++ const 指針與指向const的指針的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07C語(yǔ)言掃雷詳細(xì)代碼分步實(shí)現(xiàn)流程
掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會(huì),幾次調(diào)試之后,發(fā)現(xiàn)這個(gè)比三子棋要復(fù)雜一些,尤其是空白展開(kāi)算法上和堵截玩家有的一拼,與實(shí)際游戲差別較大,不能使用光標(biāo),下面來(lái)詳解每一步分析2022-02-02Objective-C限制函數(shù)調(diào)用的頻率詳解
這篇文章主要給大家介紹了關(guān)于Objective-C限制函數(shù)調(diào)用的頻率的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12