根据此https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html,已发布的存储MOV
在 x86(包括 x86-64)上实现为(到内存中)。
根据他的http://en.cppreference.com/w/cpp/atomic/memory_order
memory_order_release:
具有此内存顺序的存储操作执行释放操作:当前线程中的任何内存访问都不能在此存储之后重新排序。这确保当前线程中的所有写入在获取或相同原子变量的其他线程中可见,并且将依赖项携带到原子变量中的写入在消耗相同原子的其他线程中变得可见。
我知道当使用memory_order_release时,之前完成的所有内存存储都应该在此之前完成。
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
告诉处理器完成所有以前的存储?