C++11内存屏障在类似x86的系统上是如何实现的?

4

我对C++11的std::memory_order类型(relaxedacquire-releasesequentially consistent)有很好的概念理解,但我希望更好地了解它们在x86(或x86_64)目标上通常是如何实现的(由编译器)。

具体而言,比较每个顺序约束(memory_order_consumememory_order_acquirememory_order_releasememory_order_seq_cst)的低级细节(例如用于在处理器之间同步状态或缓存的重要内存相关CPU指令)。

请尽可能提供更多的低级细节,最好是针对x86_64或类似的架构。非常感谢您的帮助。

2个回答

6

在x86和x86_64中,即使没有使用原子操作,加载具有获取语义,存储具有释放语义,因此除了seq_cst之外的所有内存顺序都不需要特殊指令。

为了获得完全的顺序一致性,编译器可以插入mfence指令,以防止对不同内存位置上的操作重新排序,但我认为不需要任何其他特殊指令。

编译器需要避免在原子操作中移动加载和存储,但这纯粹是对编译器优化器的限制,不需要发出CPU指令。

请参见http://www.stdthread.co.uk/forum/index.php?topic=72.0以获取更多信息。


2
Herb Sutter在他的C++ and Beyond 2012的atomic<> Weapons演讲中分解了x86和其他体系结构(包括PowerPC和ARM)的原子操作。我认为相关的幻灯片在 第二个 部分,但第一个部分也值得一看。

这也非常有帮助。+1。 - etherice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接