volatile是c语言中的一个关键字,在语言层面我们很难理解它,今天从信号角度我们来理解一下。
我们来看下面一段代码:
从代码表面看上去运行逻辑应该是,flag为0时候一直while循环,当有信号2产生进入到信号2的处理函数中,flag改成1,循环结束,进程退出。但是事实真的是如此吗?
我们用编译器O3的优化级别来编译(默认是O1或O2),然后运行,结果如下:
我们发现收到信号后进程并没有退出。原因是main函数和和信号处理函数是两个执行流,while循环在main函数中,编译器只会检查main函数,发现flag并没有main函数中改变。在优化级别较高的时候,flag会被直接写进cpu的寄存器中,cpu读取flag时直接从寄存器里读,信号处理函数改变flag改变的是flag在内存中的值,寄存器中flag的值始终保持0。
为了解决这个问题,我们可以在定义flag的时候前面加上volatile。
volatile int flag=0;
再次编译运行,发现可以退出:
volatile的作用:
避免变量被写到寄存器中,就算写到内存器中,读取时也要先读取内存中的值,然后刷新到寄存器里。
原文链接:https://blog.csdn.net/weixin_59371851/article/details/126561197