a 以 volatile 修饰
1. 以 a=a+1 为例
cpu0 进行计算的时候 ,假如把指令发到了 storebuffer中,
而a=a+1,相当于是temp=a+1;a=temp;
a+1不会刷内存,a=temp才会刷
假如在 a+1的时候 ,别的cpu 可能已经修改了a的值。。。导致脏数据产生。
总结:问题就出在 如果操作化成多步骤的情况下 (上面是 a+1),其中a+1的操作不会去刷内存导致最终结果出问题。
2.以 a=10 为例
这种情况的话 ,MESI协议同时只能一个cache是M状态,你数据在storebuffer里表示此时你的状态是M,写完就强刷cache了,顺带刷内存 所以最终结果是正确的。