带有std::memory_order_release
to 某个位置的商店可以重新排序,随后从另一个位置加载std::memory_order_acquire
.
但是,具有某个位置的商店std::memory_order_release
是否可以在随后从另一个位置加载时重新排序std::memory_order_seq_cst
?
类似地,一个存储std::memory_order_seq_cst
到一个变量的存储是否可以在随后从另一个位置加载时重新排序std::memory_order_acquire
?
考虑这个例子:
std::atomic<int> x{0};
std::atomic<int> y{0};
void thread1() {
x.store(std::memory_order_release, 1);
int r1 = y.load(std::memory_order_seq_cst);
std::cout << r1 << std::endl;
}
void thread2() {
y.store(std::memory_order_seq_cst, 1);
int r2 = x.load(std::memory_order_acquire);
std::cout << r2 << std::endl;
}
众所周知(http://bartoszmilewski.com/2008/11/05/who-ordered-memory-fences-on-an-x86/)如果两者std::memory_order_seq_cst
都被它们的释放/获取对应物替换,输出可能是两个乘以“0”。
在这个例子中,顺序一致性是否可以购买任何东西,或者输出仍然可以是“0”的两倍?