赞
踩
当一个变量被volatile修饰后,具有两个特性:
volatile的使用场景
volatile修饰的变量在赋值后多执行了一个“lock addl $0x0,(%esp)”操作。这个操作相当于一个内存屏障。只有一个CPU访问内存时,并不需要内存屏障;但如果有两个或更多的CPU访问内存,就需要内存屏障来保证一致性。
那么lock指令时如何实现内存的可见性的呢?
答:lock指令使本CPU的Cache写入内存, 该写入动作会引起其他的CPU或者内核无效化
lock指令如何实现禁止指令重排序的呢?
答:lock addl $0x0,(%esp)
指令把修改同步到内存时,意味着所有之前的操作已经执行完成,这样便形成了“指令重排序无法越过内存屏障”的效果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。