Выбор ответа Junior Многопоточность и модель памяти спрашивают часто обновлено
Что такое гонка данных
Вопрос
Два потока без синхронизации выполняют ++counter; для общего int counter. Что говорит стандарт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Это гонка данных и неопределённое поведение. Конкурентный доступ к одной ячейке без синхронизации, где хотя бы один доступ запись, это data race, UB для всей программы.
Варианты ответа
- Значение будет меньше ожидаемого, но поведение определено
- Всё корректно: инкремент int атомарен
- Это гонка данных и неопределённое поведениеправильный ответ
- Компилятор автоматически вставит блокировку
Разбор
Конкурентный доступ к одной ячейке без синхронизации, где хотя бы один доступ запись, это data race, UB для всей программы. Потеря инкрементов лишь самое частое проявление. Нужен std::atomic<int> или мьютекс.
- «Определённо меньше» неверно: стандарт ничего не гарантирует.
++дляintэто чтение, изменение и запись, не атомарные.- Автоматической синхронизации нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Ожидание на condition_variable
Следующий вопрос
Как избежать дедлока с двумя мьютексами
Ещё по теме «Многопоточность и модель памяти»
- Найти потенциальный дедлок по порядку захвата мьютексов
- Пул потоков: кто и когда выполнит задачу
- Публикация данных через флаг
- Ловушка std::async
- Потокобезопасная ленивая инициализация
- compare_exchange
- lock_guard, unique_lock, scoped_lock
- Примитив синхронизации и задача