如果使用單個原子變量和std::memory_order_seq_cst
,是否保證非原子操作不被重新排序?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
使用原子操作,互斥鎖,柵欄或者其他同步功能。
Nitpicking,但是:雖然cppreference.com是一流的,但它不是ISO標準。 – Zeta
@澤塔你是對的。我發現cppreference.com相當準確,但可能會有遺漏,因爲它不是標準的副本。 –