Выбор ответа Junior Многопоточность и модель памяти спрашивают часто обновлено
Забыли join
Вопрос
Что произойдёт, если объект std::thread уничтожен, а у него не вызвали ни join(), ни detach()?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Вызовется std::terminate. Деструктор std::thread для joinable-потока вызывает std::terminate: стандарт не стал угадывать, ждать или отпускать. std::jthread (C++20) в деструкторе сам запрашивает остановку и делает join. - Ожидание в деструкторе это поведение…
Варианты ответа
- Деструктор дождётся завершения потока
- Поток будет отсоединён автоматически
- Поток будет принудительно остановлен
- Вызовется
std::terminateправильный ответ
Разбор
Деструктор std::thread для joinable-потока вызывает std::terminate: стандарт не стал угадывать, ждать или отпускать. std::jthread (C++20) в деструкторе сам запрашивает остановку и делает join.
- Ожидание в деструкторе это поведение
jthread. - Автоматического
detachнет. - Принудительной остановки потоков в C++ нет вообще.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Многопоточность и модель памяти»
- Найти потенциальный дедлок по порядку захвата мьютексов
- Пул потоков: кто и когда выполнит задачу
- Публикация данных через флаг
- Ловушка std::async
- Потокобезопасная ленивая инициализация
- compare_exchange
- Ожидание на condition_variable
- Что такое гонка данных