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

eth*_*ice 3 c++ x86 x86-64 memory-barriers c++11

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

具体而言,低级别的细节(例如用于处理器之间的同步状态或高速缓存存储器的重要相关的CPU指令)为每个顺序的限制进行比较(memory_order_consume,memory_order_acquire,memory_order_release,和memory_order_seq_cst).

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

Jon*_*ely 5

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

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

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

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