美文网首页
C++11 memory order

C++11 memory order

作者: sealwang24 | 来源:发表于2020-04-05 10:56 被阅读0次

为什么要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/

相关文章

网友评论

      本文标题:C++11 memory order

      本文链接:https://www.haomeiwen.com/subject/gunyphtx.html