如果使用单个原子变量和 std::memory_order_seq_cst
,是否保证非原子操作不会被重新排序?
例如,如果我有
std::atomic<bool> quux = {false};
void foo() {
bar();
quux.store(true, std::memory_order_seq_cst);
moo();
}
是 bar()
保证在调用 store
之后不会重新排序,并且 moo()
在调用之前不会重新排序store
,只要我使用std::memory_order_seq_cst
,至少从另一个线程的角度来看?
或者,换句话说,如果从另一个线程运行,以下假设是否有效?
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
都没有使用原子操作、互斥锁、锁、栅栏或其他同步功能。
最佳答案
根据链接http://en.cppreference.com/w/cpp/atomic/memory_order由 @Maxim 链接,关于 memory_order_seq_cst 存在错误。上面的文本与 memory_order_acq_rel 交换。 memory_order_seq_cst 的文本:
memory_order_seq_cst:这个内存顺序的load操作执行acquire操作,store执行release操作,read-modify-write同时执行acquire操作和release操作,再加上所有线程存在一个总顺序以相同的顺序观察所有修改(请参阅下面的顺序一致排序)
因此在您的情况下,存储操作等同于释放,这意味着 moo() 可以在栅栏之前重新排序。
关于c++ - memory_order_seq_cst 如何与非原子操作同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41342206/