根据这个https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html,
已发布的商店实现为MOV
(进入内存)在 x86(包括 x86-64)上。
根据他的http://en.cppreference.com/w/cpp/atomic/memory_order http://en.cppreference.com/w/cpp/atomic/memory_order
内存顺序释放:
使用此内存顺序的存储操作执行释放
操作:当前线程中的内存访问不能重新排序
继这家店之后。这确保了当前线程中的所有写入
在获取相同原子变量的其他线程中可见
并将依赖项写入原子变量成为
在消耗相同原子的其他线程中可见。
我明白当内存顺序释放使用时,之前完成的所有内存存储都应在此之前完成。
int a;
a = 10;
std::atomic<int> b;
b.store(50, std::memory_order_release); // i can be sure that 'a' is already 10, so processor can't reorder the stores to 'a' and 'b'
问题:怎么可能是一个裸露的MOV
指令(没有显式内存栅栏)足以满足此行为吗?如何MOV
告诉处理器完成所有先前的存储?
运行时内存重新排序(由 CPU 完成),编译时内存重新排序。请阅读Jeff Preshing 关于编译时重新排序的文章 http://preshing.com/20120625/memory-ordering-at-compile-time/(以及该博客上的许多其他好文章)以获取更多信息。
memory_order_release
防止编译器重新排序对数据的访问,以及发出任何必要的防护或特殊指令。在 x86 asm 中,普通加载和存储已经具有获取/释放语义,因此阻止编译时重新排序对于 acq_rel 来说就足够了,但对于 seq_cst 来说则不够。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)