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

时间:2013-05-29 12:52:31

标签: c++ c++11 x86 x86-64 memory-barriers

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

具体而言,比较每个订单约束(memory_order_consumememory_order_acquire,{memory_order_releasememory_order_seq_cst,{的低级详细信息(例如,用于同步处理器之间的状态或缓存的重要内存相关CPU指令) {1}}和{{1}})。

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

Herb Sutter为x86打破了这个问题,其他架构包括PowerPC和ARM的 atomic<>武器在C ++和2012年之后进行谈话。我认为相关的幻灯片位于second部分,但first部分也值得关注。