Выбор ответа Senior Многопоточность и модель памяти обновлено

memory_order_relaxed

Вопрос

Что гарантирует counter.fetch_add(1, std::memory_order_relaxed)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Атомарность самой операции без упорядочивания других обращений к памяти. relaxed гарантирует неделимость и единый порядок изменений этого атомика: инкременты не теряются, итог правильный.

Варианты ответа

  1. Полный порядок относительно всех атомарных операций, как у seq_cst
  2. Ничего: relaxed-операции могут терять инкременты под нагрузкой
  3. Атомарность самой операции без упорядочивания других обращений к памятиправильный ответ
  4. Видимость всех предыдущих записей этого потока для других потоков

Разбор

relaxed гарантирует неделимость и единый порядок изменений этого атомика: инкременты не теряются, итог правильный. Но не создаёт отношения happens-before, поэтому через relaxed-флаг нельзя публиковать другие данные. Подходит для счётчиков статистики.

  • Глобальный порядок даёт seq_cst.
  • Инкременты не теряются: это атомарная операция.
  • Видимость предыдущих записей даёт release (в паре с acquire).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.