变量加了volatile修饰以后多了2个特征
- 可见性
- 阻止重排
汇编代码差别
同一个赋值语句, 给变量加了volatile 以后

ock addl$0x0,(%esp)”操作,这个操作的作用相当于一个内存屏障
“addl$0x0,(%esp)”(把ESP寄存器的值加0)
作用是将
- 本处理器的缓存写入了内存,
- 该写入动作也会引起别的处理器或者别的内核无效化(Invalidate)其缓存
因此也能骑到 “指令重排序无法越过内存屏障”的效果,
因为 指令重排,必须保证 正确的执行结果,
lock addl$0x0,(%esp)指令把修改同步到内存时,意味着所有之前的操作都已经执行完成,
这之前的指令, 就不能跑到这之后
8个原子操作对valtile的特殊规定
8种原子指令
- 锁和解锁
- 主内存中
工作内存->主内存: store,write
和read load相反 - 执行引擎 和 工作内存: use,assign
- 主内存-> 工作内存 :read,load
read: 从主内存读到工作内存load: read到在值存入哪个变量的副本
8种原子操作定义+其限定+valtile的特殊规定=描述时候线程安全
↑等效于: 现行发生原则
valtile的特殊规定
- 1.用的值, 必须从主内存拿
use之前 必须是 read + load
- 更新的值,必须更到主内存
assigin 之后, 必须是 store+write
- 不能重排
A B 2个线程都 use, A use在前, 就read + load也在前, 更新也一样规则
网友评论