Если использовать одну атомную переменную и std::memory_order_seq_cst
, неатомные операции гарантируют, что они не будут переупорядочены?Как происходит синхронизация памяти_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
@Zeta Вы правы. Я считаю, что cppreference.com достаточно точна, но могут быть пропуски, поскольку это не копия стандарта. –