C++中的volatile關(guān)鍵字及其作用
volatile是C語言的一個關(guān)鍵字,該關(guān)鍵字的作用是保持內(nèi)存的可見性
例子:
我們對2號信號進行了捕捉,當(dāng)該進程收到2號信號時會將全局變量flag由0置1, 也就是說,在進程收到2號信號之前,該進程會一直處于死循環(huán)狀態(tài),直到收到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函數(shù)和handler函數(shù)是兩個獨立的執(zhí)行流
判斷一個數(shù)據(jù)為真為假 -> 邏輯運算 -> 需要CPU參與 ,常規(guī)情況下,需要從內(nèi)存加載到CPU,然后CPU內(nèi)部做判斷,然后再把結(jié)果返回
而while循環(huán)是在main函數(shù)當(dāng)中的,編譯器發(fā)現(xiàn):我們只對flag這個變量做檢測,而不做修改, 編譯器直接優(yōu)化,把flag的值保存在寄存器中,直接在CPU檢測

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

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

到此這篇關(guān)于C++中的volatile關(guān)鍵字及其作用的文章就介紹到這了,更多相關(guān)C++ volatile關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于QT制作一個TCPServer與TCPClient的通信
這篇文章主要為大家詳細(xì)介紹了如何基于QT制作一個TCPServer與TCPClient的通信,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12

