Выбор ответа Senior Многопоточность и модель памяти обновлено
Ловушка std::async
Вопрос
Почему вызов std::async(std::launch::async, work); без сохранения результата выполняется синхронно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Деструктор временного future от std::async ждёт завершения задачи. Future, полученный от std::async, особый: его деструктор блокируется до завершения задачи.
Варианты ответа
std::asyncвсегда синхронный, параллелизм даёт толькоstd::thread- Деструктор временного future от
std::asyncждёт завершения задачиправильный ответ - Политика
launch::asyncзапускает задачу в текущем потоке вызова - Компилятор оптимизирует неиспользуемый future и вызывает
workнапрямую
Разбор
Future, полученный от std::async, особый: его деструктор блокируется до завершения задачи. Если результат не сохранить, временный объект умрёт сразу и превратит асинхронный вызов в синхронный. Ещё одна ловушка: политика по умолчанию async | deferred позволяет отложить запуск до get().
- С сохранённым future задача действительно идёт параллельно.
launch::asyncгарантирует запуск в новом потоке (как если бы).- Это не оптимизация, а поведение деструктора.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Многопоточность и модель памяти»
- Найти потенциальный дедлок по порядку захвата мьютексов
- Пул потоков: кто и когда выполнит задачу
- compare_exchange
- Ожидание на condition_variable
- Что такое гонка данных
- Как избежать дедлока с двумя мьютексами
- lock_guard, unique_lock, scoped_lock
- Примитив синхронизации и задача