在C++ and Beyond 2012:Herb Sutter - atomic<> Weapons,第2部分中,Herb Sutter(约在0:38:20左右)认为应该使用xchg
而不是mov
/mfence
来实现x86上的atomic_store
。他似乎还暗示这个特定的指令序列是所有人都同意的。然而,GCC使用后者。为什么GCC使用这个特定的实现方法?
在C++ and Beyond 2012:Herb Sutter - atomic<> Weapons,第2部分中,Herb Sutter(约在0:38:20左右)认为应该使用xchg
而不是mov
/mfence
来实现x86上的atomic_store
。他似乎还暗示这个特定的指令序列是所有人都同意的。然而,GCC使用后者。为什么GCC使用这个特定的实现方法?
mov
和mfence
方法更快,因为它不会像xchg
那样触发冗余的内存读取,而后者需要花费更多时间。x86 CPU 保证线程之间的写入顺序严格一致,因此足够了。mov
指令的错误,这使得xchg
必需。但这已经是很久以前的事情了,对大多数用户来说,解决这个问题并不值得付出额外的开销。xchg
必需的信息。xchg
,因为他似乎对这个主题很有了解。 - tibbexchg
更好,我发现一些过时的文档中提到 mfence
+ mov
在某些 Athlon 处理器上速度较慢,在一些早期的 Pentium 处理器上则无法正常工作。也许这些建议曾经是明智的,但现在已经有点过时了。不过他可能在演讲之前做了一些研究,并且那时使用的 CPU 甚至更加过时,我可以想象他可能得出了这样的结论。然而,几乎所有的文档都说,如果不是非常老的 CPU,mov
mfence
路径在现代 CPU 上更快。 - Valitymov
+mfence
速度较慢;GCC最近为seq_cst存储切换了使用方式,现在像其他编译器一样使用xchg
。它已经需要将缓存行的副本转换为独占所有权状态(除了全行写入,提交存储需要一个最新的行副本),因此额外的读取根本不重要。另请参见Does lock xchg have the same behavior as mfence?,并注意Skylake微码更新,使mfence
具有类似于lfence
的OoO exec屏障,而不像xchg
。 - Peter Cordes