C++ std::async и std::thread когда что использовать

Рейтинг: 59.6% · 10 голосов
Python, Rust, Go, C++, C#, Java, Kotlin: синтаксис, паттерны проектирования, производительность, многопоточность и сравнение языков.
Аватара пользователя
navspy
Сообщения: 60
Зарегистрирован: 12 май 2026, 02:48

C++ std::async и std::thread когда что использовать

Сообщение navspy »

Пишу на C++17, нужно распараллелить несколько независимых вычислений и дождаться результатов. Смотрю на std::async и std::thread — оба могут запустить что-то параллельно. В чём принципиальная разница? Когда использовать std::async с std::launch::async, а когда std::thread напрямую? И что за std::launch::deferred — это вообще для чего?
👍 ❤️ 🔥 😄 🤔
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — RedisNinja
std::launch::deferred — это ленивое вычисление, функция запустится синхронно в том же потоке только когда вызовешь fut.get() или fut.wait(). Никакого параллелизма. Используется для отложенной инициализации или когда хочешь единый интерфейс через future, но реальная параллельность не нужна. Я видел код, где люди писали async(...) без явного launch::async и удивлялись, почему оно медленно…
Перейти к ответу →
Аватара пользователя
Bowden
Сообщения: 80
Зарегистрирован: 12 май 2026, 09:21

Re: C++ std::async и std::thread когда что использовать

Сообщение Bowden »

Главное отличие: std::async возвращает std::future и сам управляет временем жизни потока (или пулом потоков — зависит от реализации). std::thread надо явно join() или detach(), иначе деструктор вызовет std::terminate — это классический источник краша. Для простых «запусти и жди результата» задач std::async удобнее и безопаснее. auto fut = std::async(std::launch::async, compute, data); auto result = fut.get(); — и всё.
👍 ❤️ 🔥 😄2 🤔2
Аватара пользователя
RedisNinja
Сообщения: 61
Зарегистрирован: 15 май 2026, 01:22

Re: C++ std::async и std::thread когда что использовать

Сообщение RedisNinja »

✔ Лучший ответ — выбран автором и совпадает с авто-подбором
std::launch::deferred — это ленивое вычисление, функция запустится синхронно в том же потоке только когда вызовешь fut.get() или fut.wait(). Никакого параллелизма. Используется для отложенной инициализации или когда хочешь единый интерфейс через future, но реальная параллельность не нужна. Я видел код, где люди писали async(...) без явного launch::async и удивлялись, почему оно медленно — стандарт позволяет реализации выбрать deferred по умолчанию.
👍3 ❤️1 🔥1 😄1 🤔1
Аватара пользователя
mstrbates
Сообщения: 88
Зарегистрирован: 11 май 2026, 00:45

Re: C++ std::async и std::thread когда что использовать

Сообщение mstrbates »

Когда точно нужен std::thread: долгоживущие потоки (воркер в очереди задач), когда нужен точный контроль над приоритетом через native_handle(), или когда реализуете свой thread pool. std::async плохо подходит для пула — каждый вызов потенциально создаёт новый поток (на большинстве реализаций). Для продакшн-кода с серьёзной нагрузкой смотри на Intel TBB или собственную реализацию с condition_variable + queue.
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
zfs_kun
Сообщения: 2
Зарегистрирован: 27 май 2026, 01:59

Re: C++ std::async и std::thread когда что использовать

Сообщение zfs_kun »

Предупреждение из практики: если забудешь сохранить future от std::async в переменную, он блокирует в деструкторе прямо в той же строке. std::async(std::launch::async, fn); — это не fire-and-forget, это блок до завершения fn. Многих это удивляет. Нужен реально огонь-и-забыл — нужен detached thread или сторонняя библиотека.
👍 ❤️1 🔥1 😄1 🤔
Аватара пользователя
kernel_veteran
Сообщения: 63
Зарегистрирован: 11 май 2026, 06:09

Re: C++ std::async и std::thread когда что использовать

Сообщение kernel_veteran »

В C++20 появились корутины и std::jthread (с автоматическим join и поддержкой cancellation через stop_token). jthread практически устаревил ручной join/detach паттерн — деструктор автоматически вызывает request_stop() и join(). Если таргетируете C++20 и выше, посмотрите в эту сторону.
👍 ❤️ 🔥1 😄1 🤔
Аватара пользователя
jbosco
Сообщения: 60
Зарегистрирован: 11 май 2026, 02:28

Re: C++ std::async и std::thread когда что использовать

Сообщение jbosco »

Для вашей конкретной задачи — несколько независимых вычислений, ждём все результаты — std::async с launch::async это правильный выбор. Пример: vector<future<Result>> futures; for (auto& item : items) futures.push_back(async(launch::async, process, item)); for (auto& f : futures) results.push_back(f.get()); Просто, читаемо, безопасно.
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
k8s_master
Сообщения: 44
Зарегистрирован: 11 май 2026, 19:55

Re: C++ std::async и std::thread когда что использовать

Сообщение k8s_master »

Все расписали async против thread, но главный практический плюс async никто не назвал. Исключения. Если функция кинет, исключение сохранится в future и вылетит в get() в вызывающем потоке, где его можно нормально обработать. С голым std::thread непойманное исключение это сразу std::terminate и кора. Для вычислений, где может прилететь что угодно, это решающий аргумент.
👍 ❤️2 🔥 😄 🤔
Аватара пользователя
async2025
Сообщения: 44
Зарегистрирован: 13 май 2026, 02:57

Re: C++ std::async и std::thread когда что использовать

Сообщение async2025 »

@jbosco, твой цикл норм пока items штук восемь. А если их 10000, на gcc и clang получишь 10000 живых потоков, пулит из реализаций только MSVC. Раз уж C++17, для независимых вычислений по контейнеру есть std::transform с std::execution::par, стандартная либа сама раскидает по ядрам без оверсабскрипшена. На gcc только не забыть -ltbb при линковке.
👍 ❤️ 🔥 😄1 🤔2
Аватара пользователя
timur12
Сообщения: 30
Зарегистрирован: 13 май 2026, 01:35

Re: C++ std::async и std::thread когда что использовать

Сообщение timur12 »

@kernel_veteran, jthread да, годная штука. но советовать корутины человеку, который спрашивает разницу между async и thread, это жестоко. голые корутины в стандарте это механизм без батареек, без своего шедулера или boost::asio с ними делать нечего, неделю будешь писать обвязку вместо задачи
👍1 ❤️1 🔥1 😄 🤔1
Ответить
Поделиться темой: ✈ Telegram VK

Вернуться в «Языки программирования»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей