在看到Herb Sutters关于[[“原子武器”的出色talk]之后,我对Relaxed Atomics示例有些困惑。[我认为 C ++内存模型std::memory_order_seq_cst
,因此两者相同:
myatomic.load(); // (1)
myatomic.load(std::memory_order_seq_cst); // (2)
到目前为止,到目前为止,还没有轻松原子学的内容(在听完演讲后,我将永远不会使用轻松原子学的东西。永远。但是,当有人问我时,我可能不得不解释一下……)。
但是为什么使用时它是“松弛”的语义
myatomic.load(std::memory_order_acquire); // (3)
由于是正在获取和未释放,为什么这与加载
(1)
和(2)
不同? 实际上在这里放松了什么?]我唯一能想到的是我误解了load
表示acquire。并且,如果这是真的,并且默认的seq_cst
表示两者,那不是意味着整个栅栏-没有什么可以传递该指令,也不能传递该指令?我必须对该部分有误解。[并且对称地表示store
和release]。[在看到Herb Sutters关于“原子武器”的精彩演讲之后,我对“轻松原子”的例子有些困惑。我认为C ++内存模型中的一个原子(SC-DRF =顺序...myatomic.load(std::memory_order_acquire);
,因此将std::memory_order_relaxed
称为“松弛原子”负载可能有点令人困惑。>您应该正确注意,顺序一致的负载是获取负载,但它还有一个附加要求:对于所有seq_cst操作,顺序一致的负载也是总全局顺序的一部分。
当您处理多个原子变量时,它就起作用了:两个原子的单独修改顺序可能以不同的相对于不同线程的相对顺序出现,除非施加顺序一致性。
如果是真的,并且默认的seq_cst
表示两者,那不是指的是完整的篱笆