关键字volatile 和信号

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值