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

Рейтинг: 59.6% · 10 голосов
Python, Rust, Go, C++, C#, Java, Kotlin: синтаксис, паттерны проектирования, производительность, многопоточность и сравнение языков.
Ответить
Аватара пользователя
savva_io
Сообщения: 41
Зарегистрирован: Вс май 10, 2026 9:03 pm

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

Сообщение savva_io »

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

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

Сообщение semyon_core »

Главное отличие: 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
Аватара пользователя
lev8912
Сообщения: 11
Зарегистрирован: Вт май 12, 2026 2:30 am

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

Сообщение lev8912 »

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

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

Сообщение vuenet6816 »

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

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

Сообщение webpixel853 »

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

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

Сообщение alex_ai72 »

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

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

Сообщение milana_dns25 »

Для вашей конкретной задачи — несколько независимых вычислений, ждём все результаты — 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 🔥 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK

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

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