volatile关键字特性及原理

版权声明:未经允许禁止转载 https://blog.csdn.net/weixin_38481963/article/details/88412030

当一个变量被volatile修饰后,具有两个特性:

  • 保证此变量对所有线程的可见性
  • 禁止指令重排序优化

volatile的使用场景

  • 运算结果不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值
  • 变量不需要与其他的状态变量共同参与不变约束

volatile修饰的变量在赋值后多执行了一个“lock addl $0x0,(%esp)”操作。这个操作相当于一个内存屏障。只有一个CPU访问内存时,并不需要内存屏障;但如果有两个或更多的CPU访问内存,就需要内存屏障来保证一致性。

那么lock指令时如何实现内存的可见性的呢?

答:lock指令使本CPU的Cache写入内存, 该写入动作会引起其他的CPU或者内核无效化

lock指令如何实现禁止指令重排序的呢?

答:lock addl $0x0,(%esp)指令把修改同步到内存时,意味着所有之前的操作已经执行完成,这样便形成了“指令重排序无法越过内存屏障”的效果。

猜你喜欢

转载自blog.csdn.net/weixin_38481963/article/details/88412030