下面是valatite与普通变量的反汇编代码对比:
普通没有加valatite变量再执行自加运算时:
1。把值放入rbp寄存器中
2。直接将变量寄存器进行自加操作;
3。清零eax寄存器
加入valatite的变量
1。把值放入rbp中,
2。取rbp的变量的值放入eax寄存器中
3。执行eax寄存器++
4。去除eax运算结果放入rbp变量的寄存器中;
实际上volatile 本身只是不是直接读取内存的值,而是把内存的值放在寄存器中,相当于copy了一份,这样做有帮助的是,判空再引用这个值不会出问题;
例如
一个线程
if(p){
p->index;
}
另外一个线程修改P也不会挂~
感觉并不能保证一致性~~例如两个线程同时p++,还是有可能会有问题~。