Выбор ответа Middle Многопоточность и модель памяти обновлено
volatile и потоки
Вопрос
Подходит ли volatile bool stop; для остановки рабочего потока из другого потока?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Нет: это гонка данных, нужен std::atomic<bool или std::stoptoken. volatile запрещает компилятору выкидывать и объединять обращения (нужно для памяти устройств), но не делает доступ атомарным и не создаёт happens-before между потоками.
Варианты ответа
- Да:
volatileзапрещает кэширование в регистре, и запись станет видна - Да, если переменная
bool: её запись и чтение атомарны на всех платформах - Да, но только при
-O0, где компилятор не выкидывает чтения в цикле - Нет: это гонка данных, нужен
std::atomic<bool>илиstd::stop_tokenправильный ответ
Разбор
volatile запрещает компилятору выкидывать и объединять обращения (нужно для памяти устройств), но не делает доступ атомарным и не создаёт happens-before между потоками. По стандарту это гонка данных, UB. Правильно std::atomic<bool> или std::jthread со std::stop_token.
- В Java
volatileозначает другое, отсюда путаница. - Тип переменной ничего не меняет.
- Уровень оптимизации не делает гонку допустимой.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Многопоточность и модель памяти»
- Найти потенциальный дедлок по порядку захвата мьютексов
- Пул потоков: кто и когда выполнит задачу
- Публикация данных через флаг
- Ловушка std::async
- Потокобезопасная ленивая инициализация
- compare_exchange
- Ожидание на condition_variable
- Что такое гонка данных