volatile的变量学习

实验

without_volatile.png

with_volatile.png

结论

  • volatile 指出 i 是随时可能发生变化(易挥发)的,每次使用它的时候必须从 i的地址中读取。
    比如,i变量虽然在当前进程看起来像个常量,但随时可能被其他进程修改,因此每次使用的时候都应该从i的地址中读取。
    或者,i是个外设寄存器,随时都可能被外设/其他处理器修改,因此读取的时候也应该从i的地址中读取。
  • 编译器遇到volatile关键字声明的变量,对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

进阶

volatile是禁止编译器对指令重排,但是重不重排还是cpu说的算。
重排指令可能会导致功能出错? 编译器可能会重排指令? CPU也可能会重排指令。
重排指令-吃不到饭.png
要求
1 “做饭”和“叫吃饭”的指令不能乱序;
2 “叫吃饭”时,一定要保证“做饭”指令执行完毕;
3 “做饭”指令执行完毕,具体指的是饭做好了,而且必须盛到碗里而不是还放在锅里,保证干饭人来了后必须立刻能吃到饭。

怎样禁止编译器重排指令?

volatile

怎样禁止处理器重排指令?

插入fence? 或者锁?
通过fence保证到吃饭.png

通过lock保证吃到饭.png

参考:
https://www.runoob.com/w3cnote/c-volatile-keyword.html
https://www.jianshu.com/p/2643c9ea1b82

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值