先执行 (1) 和 (3),将他们直接写入 store buffer,接着执行 (2) 和 (4)。
“奇迹”要发生了:
(2) 看了下 store buffer,并没有发现有 B 的值,于是从 Memory 读出了 0,
(4) 同样从 Memory 读出了 0。
最后,打印出了 00。
因此,对于多线程的程序,所有的 CPU 都会提供“锁”支持,称之为 barrier,或者 fence。
它要求:barrier 指令要求所有对内存的操作都必须要“扩散”到 memory 之后才能继续执行其他对 memory 的操作。
因此,我们可以用高级点的 atomic compare-and-swap,或者直接用更高级的锁,通常是标准库提供。
这里 请先自行查阅 MESI缓存一致性协议 和内存屏障
内存屏障
MESI缓存一致性协议 如果不像查阅其他资料 请往下看
现在的处理器都是多核处理器,并且每个核都带有多个缓存(指令缓存和数据缓存,见下图)。
为什么需要缓存呢,这是因为CPU访问内存的速度比较慢,所以在CPU和内存之间加了个缓存以提高访问速度。
既然每个核都有缓存,那么假设两个核或者多个核同时访问同一个变量时这些缓存是如何进行同步的呢(缓存细分为一个个缓存行), 这就有了MESI协议。
1、L1、L2缓存成为本地核心内缓存,即一个核一个。
如果你的机器是4核,那就是有4个L1+4个L2 2、L3缓存是所有核共享的。
即不管你的CPU是几核,这个CPU中只有一个L3 3、L1缓存的大小是64K,即32K指令缓存+32K数据缓存。
L2是256K,L3是2M。这不是绝对的,目前Intel CPU基本是这样的设计
这里还补充一个知识点:缓存行(Cache-line)。缓存行是CPU缓存存储数据的最小单位,大小为64B。