提问者:小点点

在x86上进行比较和交换-为什么它是一个完整的屏障?


根据这个问题的答案,似乎x86上的LOCK CMPXCHG实际上会导致一个完全的障碍。据推测,这也是Unsafe. compareAndSwapInt()在引擎盖下生成的。我很难理解为什么会这样:使用MESI协议,在您更新缓存行之后,CPU是否可以简单地使其他内核上的缓存行无效,而不是耗尽执行CAS的内核的所有存储/加载缓冲区?对我来说似乎相当浪费…


共1个答案

匿名用户

据我所知,你的答案在注释中——MESI更新缓存,而不是存储/加载缓冲区。但是lockLOCK CMPXCHG说:锁定操作序列化所有未完成的加载和存储操作-这就是为什么它需要从这个CPU中耗尽存储/加载缓冲区(而不是这里详述的其他缓冲区)。

因此,当前CPU必须对最近的值执行原子操作——该值可能驻留在存储/加载缓冲区中,这就是为什么需要一个栅栏来实际耗尽它。