两个线程各执行100次i++
,得到的可能值
最大值 200,最小值 2
获得最小值的过程:
- 线程1:在 CPU0 执行,从内存取值 0 到寄存器 RegX。此时内存中为 memory = 0.
- 线程2:在 CPU1 执行,从内存取值 0 到寄存器 RegY,执行 99 次自加操作,这其中可能回写到内存。第 99 次计算完毕,写回到内存,此时内存中为 memory = 99。
- 线程1:开始第 1 次自加,并写回内存。此时内存中为 memory = 1.
- 线程2:从内存取值(此时为 memory = 1)到寄存器 RegY,完成第 100 次自加,结果为 RegY = 2,在还没回写到内存之前,线程 1 已经完成了以下第 5 步。
- 线程1:从内存取值(此时为 memory = 1)到寄存器 RegX,完成剩余 99 次自加,此时 RegX = 100,然后写回内存,此时 memory = 100。
- 线程2:将 RegY = 2 写回内存,最终 memory = 2.
i=100
,两个线程各执行50次i--
,得到的可能值
最大值 98,最小值 0
获得最大值的过程:
参考
- https://blog.csdn.net/zhangrui_fslib_org/article/details/50311195
- https://wenku.baidu.com/view/233e49f483eb6294dd88d0d233d4b14e85243e02.html
- CPU缓存一致性
- 缓存一致性协议
- 缓存一致性的解释
- 缓存一致性协议:强烈推荐
- CPU是如何通过缓存一致性MESI协议来解决可见性的