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

时间:2017-07-13 12:44:51

标签: java multithreading atomic memory-barriers compare-and-swap

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

1 个答案:

答案 0 :(得分:1)

就我所见,你的回答是在评论中 - MESI更新缓存,而不是Store/Load buffers。但是锁LOCK CMPXCHG说:locked operations serialize all outstanding load and store operation - 这就是为什么它需要从这个CPU中排出存储/加载缓冲区(而不是其他详细的here)。

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