如果使用一个单一的原子变量和
请注意,我假设
std::memory_order_seq_cst
,那么非原子操作是否保证不会被重新排列?例如,如果我有:std::atomic<bool> quux = {false};
void foo() {
bar();
quux.store(true, std::memory_order_seq_cst);
moo();
}
如果我使用std::memory_order_seq_cst
,那么在调用store
之后bar()
是否保证不会被重新排序,在调用store
之前moo()
是否保证不会被重新排序?至少从另一个线程的角度来看,这些假设是有效的吗?
或者,换句话说,如果从另一个线程运行以下代码,这些假设是否有效?
if(quux.load(std::memory_order_seq_cst) == true) {
// bar guaranteed to be called; its side-effects are visible
// moo might have been called, but is not guaranteed to
} else {
// bar might have been called, but is not guaranteed to
// moo might have been called, but is not guaranteed to
}
请注意,我假设
bar
和moo
都没有使用原子操作、互斥锁、锁、栅栏或其他同步特性。
memory_order_seq_cst
的最新描述,但在我看来只有第一句话被详细说明了。我认为你关于“交换文本”的说法是不正确的。 - Maxim Egorushkin