4

我对 C++11 的std::memory_order类型有很好的概念性理解(宽松vs获取发布vs顺序一致......),但我想更好地理解它们通常是如何(由编译器)为 x86 实现的(或 x86_64) 目标。

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

请提供尽可能多的底层细节,最好是x86_64或类似架构。您的帮助将不胜感激。

4

2 回答 2

6

在 x86 和 x86_64 上,加载具有获取语义,而存储具有释放语义,即使不使用原子,所以除了所有的内存顺序都不seq_cst需要特殊指令。

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

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

有关一些好的信息,请参阅http://www.stdthread.co.uk/forum/index.php?topic=72.0

于 2013-05-29T14:01:54.747 回答
2

Herb Sutter 在他的atomic<> Weapons talk from C++ and Beyond 2012中对 x86 和其他架构(包括 PowerPC 和 ARM)进行了分解。我认为相关幻灯片在第二部分,但第一部分也值得一看。

于 2013-05-29T18:21:47.273 回答