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