这是来自http://en.cppreference.com/w/cpp/atomic/memory_order
的代码#include <thread>
#include <atomic>
#include <cassert>
std::atomic<bool> x = {false};
std::atomic<bool> y = {false};
std::atomic<int> z = {0};
void write_x()
{
x.store(true, std::memory_order_seq_cst);
}
void write_y()
{
y.store(true, std::memory_order_seq_cst);
}
void read_x_then_y()
{
while (!x.load(std::memory_order_seq_cst))
;
if (y.load(std::memory_order_seq_cst)) {
++z;
}
}
void read_y_then_x()
{
while (!y.load(std::memory_order_seq_cst))
;
if (x.load(std::memory_order_seq_cst)) {
++z;
}
}
int main()
{
std::thread a(write_x);
std::thread b(write_y);
std::thread c(read_x_then_y);
std::thread d(read_y_then_x);
a.join(); b.join(); c.join(); d.join();
assert(z.load() != 0); // will never happen
}
现在,如果我们认为由线程a和b引起的内存访问是使用不同的内存顺序参数(如std :: memory_order_relaxed)执行的,并且由c和d引起的访问保持不变,那么如何实现线程c和d看到x和y内的商店的不同顺序? (或者是否所有内存访问都允许std :: memory_order_relaxed?)
是什么导致两个不同的读者线程看到不同的执行顺序? 什么架构允许这个? 是因为缓存更新不是以相同的顺序进行的吗?