C语言关键字之 volatile

  本文记录了C语言中 Volatile 关键字的作用。

变量使用 volatile 修饰

  • 告诉编译器,该变量随时会发生变化,每次使用该变量直接到内存中去读取,而不是使用暂存在寄存器中的值
  • 因为当程序中多次读取同一个变量中的值时,编译器会将该变量进行优化,将该变量暂存到寄存器或缓存中供程序使用,而这时如果我们访问该变量的值时,程序就会取寄存器或暂存里的值,而不是内存中的值。这个缓存中的值和内存中的值不一致
  • 当使用 volatile 修饰时,会告诉编译器,不能把该变量优化存储到缓存里面,当程序访问该变量时,都会去内存中读取该变量,这样取出的值才是实际的值。
  • 遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
  1. 会阻止编译器对可变对象的优化,而这些优化是编译器无法预知的
  2. volatile 修饰,系统总是会从主存里读取值,而不是从临时缓存里读取

volatile 使用场景

其实不只是内嵌汇编操纵栈"这种方式属于编译无法识别的变量改变,另外更多的可能是多线程并发访问共享变量时,一个线程改变了变量的值,怎样让改变后的值对其它线程 visible。一般说来,volatile用在如下的几个地方:

  1. 中断服务程序中修改的供其它程序检测的变量需要加 volatile;
  2. 多任务环境下各任务间共享的标志应该加 volatile;
  3. 存储器映射的硬件寄存器通常也要加 volatile 说明,因为每次对它的读写都可能由不同意义;

多线程下的volatile

  当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。

参考:
https://www.runoob.com/w3cnote/c-volatile-keyword.html

https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777432.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caso_卡索

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值