Недавно я изучаю код проекта cppcoro. И у меня есть вопрос.
https://github.com/lewissbaker/cppcoro/blob/master/lib/async_auto_reset_event.cpp#L218 https://github.com/lewissbaker/cppcoro/blob/master/lib/async_auto_reset_event.cpp#L284
if (waiter->m_refCount.fetch_sub(1, std::memory_order_release) == 1) // #218
{
waiter->m_awaiter.resume();
}
используя запись memory_order_release в строке 218, m_refCount с использованием флага memory_order_acquire может правильно загрузить значение в строке 284. Это нормально. Но fetch_sub — это операция RMW. Чтобы правильно прочитать модификацию в строке 284, нужен ли также флаг memory_order_aquire? Поэтому мне интересно, почему m_refCount не использует memory_order_acq_rel в строке 218 и строке 284?
return m_refCount.fetch_sub(1, std::memory_order_acquire) != 1; // #284
Спасибо.