为什么要momory order
data = 0;
bool flag = false;
void thread1() {
data = 42;
flag = true;
}
void thread2() {
while (!flag) {
}
assert(data == 42);
}
线程1 可能发生指令重排,导致线程2断言失败
1.现代CPU保证单个CPU看到自己的执行顺序和代码的顺序是一致的
2.CPU之间看到其他CPU的执行顺序和代码的顺序可能不一致
加上momery order
std::atomic<int> data;
std::atomic<bool> flag;
void thread1() {
data.store(42, std::memory_order_seq_cst);
flag.store(true, std::memory_order_seq_cst);
}
void thread2() {
while (!flag.load(std::memory_order_seq_cst)) {
}
assert(data.load(std::memory_order_seq_cst) == 42);
}
最后强调一下memory order只是一个order,不要联系到汇编代码,也不要联系到可见性之类问题。原子变量的操作永远是原子的,不管你用什么memory order。以及在撰写并发代码时,先用默认的seq_cst,在厘清顺序关系之后才考虑用seq_cst以外的顺序关系。
参考:
http://blog.gssxgss.me/how-to-understand-cpp-atomic-memory-order-1/
网友评论