我对 x86 上的顺序一致加载操作感兴趣。
据我从汇编器列表中看到,由编译器生成它是作为 x86 上的普通加载实现的,但是据我所知,普通加载保证具有获取语义,而普通存储保证具有释放。
顺序一致存储实现为锁定的 xchg,而加载为普通加载。这对我来说听起来很奇怪,你能详细解释一下吗?
添加了
刚刚在互联网上发现,只要使用锁定的 xchg 完成存储,就可以像简单的 mov 一样完成顺序一致的原子加载,但是没有证据,也没有指向文档的链接。
最佳答案
x86 上的普通 MOV
足以进行原子顺序一致加载,只要 SC 存储是使用 LOCK
ed 指令完成的,值正确对齐,并且使用“正常”WB 缓存模式。
有关完整映射,请参阅我在 http://www.justsoftwaresolutions.co.uk/threading/intel-memory-ordering-and-c++-memory-model.html 上的博客文章,以及 http://developer.intel.com/products/processor/manuals/index.htm 上的英特尔处理器文档,了解允许排序的详细信息。
如果您使用“WC”缓存模式或“非临时”指令(例如 MOVNTI
),那么所有赌注都将关闭,因为处理器不一定会及时将数据写回主内存。
关于assembly - x86 上顺序一致的原子负载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4972106/