C/C++关键字:volatile 的应用场景

C/C++关键字:volatile 的应用场景

volatile 的简介

当对象的值可能在程序的控制或检测之外被改变时,应该将该对象声明为 volatile,告知编译器不应对这样的对象进行优化。volatile 关键字修饰变量后,提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有 volatile 关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
使用 volatile 关键字试图阻止编译器过度优化,volatile 主要作用如下:
阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回;(缓存一致性协议、轻量级同步)
阻止编译器调整操作 volatile 变量的指令排序。

volatile 的应用场景

1.在同硬件交互的时候如果我们通过一个变量映射一个寄存器,那么我们对变量的赋值操作:
regValue = 0xaa;
regValue = 0xbb;
regValue = 0xcc;
如果变量regValue 不用volatile修饰的话会被编译器优化,上述三行代码就变成一句了regValue = 0xcc;。这显然是不能接受的。
2.在多线程的全局变量访问中,如果多个线程要同时访问同一个全局变量regValue ,就容易出现当前线程将此变量优化到寄存器而非在内存,对此变量的读写都是在修改寄存器,而非修改内存。这样就导致其他线程去内存地址中读不到上一个线程对此变量修改的最终数值。

作者:LeetCode
链接:https://leetcode.cn/leetbook/read/cmian-shi-tu-po/vwudo7/
来源:力扣(LeetCode)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值