我对C ++ 11的std::memory_order
类型(轻松 vs 获取 - 发布 vs 顺序一致)有一个很好的概念性理解...),但我想更好地了解它们(通过编译器)对x86(或x86_64)目标的实现方式。
具体而言,比较每个订单约束(memory_order_consume
,memory_order_acquire
,{memory_order_release
,memory_order_seq_cst
,{的低级详细信息(例如,用于同步处理器之间的状态或缓存的重要内存相关CPU指令) {1}}和{{1}})。
请提供尽可能多的低级详细信息,最好是 x86_64 或类似的架构。非常感谢您的帮助。
答案 0 :(得分:5)
在x86和x86_64上,加载具有获取语义,并且存储具有释放语义,即使不使用原子,所以除了seq_cst
之外的所有内存顺序都不需要特殊指令。
为了获得完整的顺序一致性,编译器可以插入mfence
指令以防止对不同内存位置上的操作进行重新排序,但我认为不需要任何其他特殊指令。
编译器需要避免在原子操作中移动加载和存储,但这纯粹是对编译器优化器的限制,并且不需要发出CPU指令。
有关一些好消息,请参阅http://www.stdthread.co.uk/forum/index.php?topic=72.0。
答案 1 :(得分:2)