根据这个问题的答案,似乎x86上的LOCK CMPXCHG实际上会导致一个完全的障碍。据推测,这也是Unsafe. compareAndSwapInt()
在引擎盖下生成的。我很难理解为什么会这样:使用MESI协议,在您更新缓存行之后,CPU是否可以简单地使其他内核上的缓存行无效,而不是耗尽执行CAS的内核的所有存储/加载缓冲区?对我来说似乎相当浪费…
据我所知,你的答案在注释中——MESI更新缓存,而不是存储/加载缓冲区
。但是lockLOCK CMPXCHG
说:锁定操作序列化所有未完成的加载和存储操作
-这就是为什么它需要从这个CPU中耗尽存储/加载缓冲区(而不是这里详述的其他缓冲区)。
因此,当前CPU必须对最近的值执行原子操作——该值可能驻留在存储/加载缓冲区中,这就是为什么需要一个栅栏来实际耗尽它。