C语言volatile关键字

1. 具体含义

Volatile关键字在C Language Keywords中的解释
Indicates that a variable can be changed by a background routine.

Keyword volatile is an extreme opposite of const.It indicates that a variable may be changed in a way which is absolutely unpredictable by analysing the normal program flow (for example, a variable which may be changed by an interrupt handler).

Every reference to the variable will reload the contents from memory rather than take advantage of situations where a copy can be in a register***.

表明这个变量会被其他后台程序改变。
volatile关键字是和const完全对立的性质,变量(被此关键字修饰的)被改变的时机通常无法预测(比如被中断处理函数改变)。
每次引用被volatile修饰的变量,变量的值都会在对应的内存中重新读取而不是利用在寄存器上的拷贝

2.作用

2.1 避免dirty数据

CPU运算速度较快,而内存读写速度较慢,为了不浪费CPU的计算能力,SOC上设计了多级内存体系:
CPU->Register->cache(可以分多级)->DDR,CPU读取速度指数级降低。所以对于一些经常访问的数据,都是保存在cache或register(如果能放下),这样可以降低CPU去DDR中取数据的耗时。

名词 含义
dirty 指cache某个位置数据被更新了,但是还没更新其对应的下一级存储位置
clean cache数据与下一级存储位置数据一致
hit CPU请求的内存地址的数据在cache中找到,称为Hit(命中)
miss CPU没有在cache里找到请求的地址信息,需要到下一级存储位置读取

但是此机制上会出现数据 dirty的问题。
比如多核多线程的环境下,如果资源共享做的不好,某个CPU改变了DDR某个变量的值,而这个变量恰好可以让其他CPU在cache中hit,就会导致其他CPU没有拿到真实值(拿到的实际是cache中的dirty值),导致程序运行没有按照预定运行。此时如果用volatile修饰这个变量,就不会出现问题。

2.2避免编译器优化

确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
这部分这篇文章写得挺好,传送门
https://blog.csdn.net/qq_29350001/article/details/54024070?utm_source=blogxgwz3

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值