在看到 Herb Sutters关于“原子武器”的精彩演讲后,我对放松原子的例子感到有些困惑。
我认为C++ 内存模型(SC-DRF = Sequentially Consistent for Data Race Free)中的原子在加载/读取时执行“获取”。
我知道对于负载 [和存储] 是默认值std::memory_order_seq_cst,因此两者是相同的:
myatomic.load(); // (1)
myatomic.load(std::memory_order_seq_cst); // (2)
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好,没有涉及放松的原子(在听完演讲后,我永远不会使用放松的原子。永远。承诺。但当有人问我时,我可能不得不解释......)。
但是为什么我使用时它是“宽松”的语义
myatomic.load(std::memory_order_acquire); // (3)
Run Code Online (Sandbox Code Playgroud)
既然负载是获取而不是释放,为什么这与(1)和不同(2)?究竟是在这里放松?
我唯一能想到的就是我误解了load意味着acquire。如果这是真的,并且默认值seq_cst意味着两者,那不就意味着一个完整的围栏 - 没有任何东西可以传递该指令,也不能传递?我一定误解了那部分。
[并且对称地用于存储和释放]。