如何为x86类系统实现C 11内存屏障?
发布时间:2020-12-16 09:45:14 所属栏目:百科 来源:网络整理
导读:我对C 11的std :: memory_order类型有一个很好的概念性理解(轻松vs获取释放与顺序一致……),但是我想更好地理解它们通常是如何实现的(通过编译器) x86(或x86_64)目标. 具体而言,比较每个订单约束(memory_order_consume,memory_order_acquire,memory_order_re
我对C 11的std :: memory_order类型有一个很好的概念性理解(轻松vs获取释放与顺序一致……),但是我想更好地理解它们通常是如何实现的(通过编译器) x86(或x86_64)目标.
具体而言,比较每个订单约束(memory_order_consume,memory_order_acquire,memory_order_release和memory_order_seq_cst)的低级细节(例如用于同步处理器之间的状态或高速缓存的重要的与存储器相关的CPU指令). 请提供尽可能多的低级细节,最好是x86_64或类似架构.非常感谢您的帮助. 解决方法
在x86和x86_64上,加载具有获取语义,并且存储具有释放语义,即使不使用原子,所以除了seq_cst之外的所有内存顺序都不需要特殊指令.
为了获得完整的顺序一致性,编译器可以插入mfence指令以防止对不同内存位置上的操作进行重新排序,但我认为不需要任何其他特殊指令. 编译器需要避免在原子操作中移动加载和存储,但这纯粹是对编译器优化器的限制,并且不需要发出CPU指令. 有关一些好的信息,请参阅http://www.stdthread.co.uk/forum/index.php?topic=72.0. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |