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

volatile и потоки

Вопрос

Подходит ли volatile bool stop; для остановки рабочего потока из другого потока?

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

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

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

Коротко

Правильный ответ: Нет: это гонка данных, нужен std::atomic<bool или std::stoptoken. volatile запрещает компилятору выкидывать и объединять обращения (нужно для памяти устройств), но не делает доступ атомарным и не создаёт happens-before между потоками.

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

  1. Да: volatile запрещает кэширование в регистре, и запись станет видна
  2. Да, если переменная bool: её запись и чтение атомарны на всех платформах
  3. Да, но только при -O0, где компилятор не выкидывает чтения в цикле
  4. Нет: это гонка данных, нужен std::atomic<bool> или std::stop_tokenправильный ответ

Разбор

volatile запрещает компилятору выкидывать и объединять обращения (нужно для памяти устройств), но не делает доступ атомарным и не создаёт happens-before между потоками. По стандарту это гонка данных, UB. Правильно std::atomic<bool> или std::jthread со std::stop_token.

  • В Java volatile означает другое, отсюда путаница.
  • Тип переменной ничего не меняет.
  • Уровень оптимизации не делает гонку допустимой.

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

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