C++中的volatile關(guān)鍵字及其作用
volatile是C語言的一個(gè)關(guān)鍵字,該關(guān)鍵字的作用是保持內(nèi)存的可見性
例子:
我們對2號信號進(jìn)行了捕捉,當(dāng)該進(jìn)程收到2號信號時(shí)會將全局變量flag由0置1, 也就是說,在進(jìn)程收到2號信號之前,該進(jìn)程會一直處于死循環(huán)狀態(tài),直到收到2號信號時(shí)將flag置1才能夠正常退出
#include <stdio.h>
#include <signal.h>
int flag = 0;
void handle(int signo)
{
printf("收到一個(gè) %d號信號\n",signo);
flag = 1;
}
int main()
{
signal(2,handle);//捕獲2號信號
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):我們只對flag這個(gè)變量做檢測,而不做修改, 編譯器直接優(yōu)化,把flag的值保存在寄存器中,直接在CPU檢測

此時(shí)main函數(shù)在檢測flag時(shí)只檢測寄存器里面的值,而handler執(zhí)行流只是將內(nèi)存中flag的值置為1了,那么此時(shí)就算進(jìn)程收到2號信號也不會跳出死循環(huán)
檢驗(yàn):在編譯器優(yōu)化級別較高的時(shí)候,就有可能將flag設(shè)置進(jìn)寄存器里面
如何提高編譯時(shí)的優(yōu)先級呢? 在編譯代碼時(shí)攜帶 -O3 選項(xiàng)使得編譯器的優(yōu)化級別最高

此時(shí)再運(yùn)行該代碼,就算向進(jìn)程發(fā)生2號信號,該進(jìn)程也不會終止
此時(shí)我們可以使用volatile關(guān)鍵字對flag變量進(jìn)行修飾,告知編譯器,對flag變量的任何操作都必須真實(shí)的在內(nèi)存中進(jìn)行,即保持了內(nèi)存的可見性
#include <stdio.h>
#include <signal.h>
volatile int flag = 0;//告知編譯器,對flag變量的任何操作都必須真實(shí)的在內(nèi)存中進(jìn)行
void handle(int signo)
{
printf("收到一個(gè) %d號信號\n",signo);
flag = 1;
}
int main()
{
signal(2,handle);//捕獲2號信號
while(!flag);
printf("進(jìn)程正常退出!\n");
return 0;
}
此時(shí)就算我們編譯代碼時(shí)攜帶 -O3 選項(xiàng),當(dāng)進(jìn)程收到2號信號將內(nèi)存中的flag變量置1時(shí),main函數(shù)執(zhí)行流也能夠檢測到內(nèi)存中flag變量的變化,進(jìn)而跳出死循環(huán)正常退出

到此這篇關(guān)于C++中的volatile關(guān)鍵字及其作用的文章就介紹到這了,更多相關(guān)C++ volatile關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于QT制作一個(gè)TCPServer與TCPClient的通信
這篇文章主要為大家詳細(xì)介紹了如何基于QT制作一個(gè)TCPServer與TCPClient的通信,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
C語言的隨機(jī)數(shù)rand()函數(shù)詳解
這篇文章主要為大家詳細(xì)介紹了C語言的隨機(jī)數(shù)rand()函數(shù),使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
C語言實(shí)現(xiàn)文本文件/二進(jìn)制文件格式互換
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)文本文件和二進(jìn)制文件格式互換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03

