在x86架构上,存储到相同内存位置的订单总数有所不同,例如,请参见this video。 C++ 11内存模型有哪些保证?对于不同线程中相同位置的两次宽松写入操作,是否总能以其他线程的相同顺序看到?
更确切地说,在
-- Initially --
std::atomic<int> x{0};
-- Thread 1 --
x.store(1, std::memory_order_release);
-- Thread 2 --
x.store(2, std::memory_order_release);
-- Thread 3 --
int r1 = x.load(std::memory_order_acquire);
int r2 = x.load(std::memory_order_acquire);
-- Thread 4 --
int r3 = x.load(std::memory_order_acquire);
int r4 = x.load(std::memory_order_acquire);
将结果r1==1, r2==2, r3==2, r4==1
被允许(在x86之外的一些架构)?如果我要用std::memory_order_relaxed
替换所有的memory_order
?
你能帮我理解p18吗? “价值计算”的代名词是来自原子的加载和“副作用”的同义词,它是存储之间的原子吗? – 2014-12-06 16:40:23
@TobiasBrüll加载是一个值计算;该商店是一个副作用。 – 2014-12-06 16:42:30
还有什么其他类型的值计算存在?还有什么其他类型的副作用? – 2014-12-06 16:49:50