Рассмотрим, что происходит с:
bool expect = true;
while(!flag.compare_exchange_strong(expect, false, std::memory_order_acq_rel)){
std::cout << "wait" << std::endl;
}
, когда флаг ложный. При первом запуске теста за время l oop expect
будет истинным, поэтому не соответствует флагу. Итак, expect
обновляется до false, и функция возвращает false. Итак, печатается wait
, а l oop повторяется. Второй тест в l oop, expect
теперь будет ложным, что соответствует flag
, поэтому для flag
будет установлено значение false (oop как оно есть), а l oop
Эффект net будет всегда устанавливать flag
на false и печатать wait
, если это уже было false
. Таким образом, вы видите результат.