Выбор ответа Senior Многопоточность и модель памяти обновлено
memory_order_relaxed
Вопрос
Что гарантирует counter.fetch_add(1, std::memory_order_relaxed)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Атомарность самой операции без упорядочивания других обращений к памяти. relaxed гарантирует неделимость и единый порядок изменений этого атомика: инкременты не теряются, итог правильный.
Варианты ответа
- Полный порядок относительно всех атомарных операций, как у
seq_cst - Ничего: relaxed-операции могут терять инкременты под нагрузкой
- Атомарность самой операции без упорядочивания других обращений к памятиправильный ответ
- Видимость всех предыдущих записей этого потока для других потоков
Разбор
relaxed гарантирует неделимость и единый порядок изменений этого атомика: инкременты не теряются, итог правильный. Но не создаёт отношения happens-before, поэтому через relaxed-флаг нельзя публиковать другие данные. Подходит для счётчиков статистики.
- Глобальный порядок даёт
seq_cst. - Инкременты не теряются: это атомарная операция.
- Видимость предыдущих записей даёт release (в паре с acquire).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Как писать потокобезопасный код
Следующий вопрос
Ревью: очередь задач и рабочий поток
Ещё по теме «Многопоточность и модель памяти»
- Найти потенциальный дедлок по порядку захвата мьютексов
- Пул потоков: кто и когда выполнит задачу
- Публикация данных через флаг
- Ловушка std::async
- Потокобезопасная ленивая инициализация
- compare_exchange
- Ожидание на condition_variable
- Что такое гонка данных