C++ std::async и std::thread когда что использовать
Рейтинг: 59.6% · 10 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
C++ std::async и std::thread когда что использовать
Пишу на 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 когда что использовать
Главное отличие: 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(); — и всё.
Re: C++ std::async и std::thread когда что использовать
✔ Лучший ответ — выбран автором и совпадает с авто-подбором
std::launch::deferred — это ленивое вычисление, функция запустится синхронно в том же потоке только когда вызовешь fut.get() или fut.wait(). Никакого параллелизма. Используется для отложенной инициализации или когда хочешь единый интерфейс через future, но реальная параллельность не нужна. Я видел код, где люди писали async(...) без явного launch::async и удивлялись, почему оно медленно — стандарт позволяет реализации выбрать deferred по умолчанию.
- vuenet6816
- Сообщения: 7
- Зарегистрирован: Пн май 11, 2026 2:57 am
Re: C++ std::async и std::thread когда что использовать
Когда точно нужен std::thread: долгоживущие потоки (воркер в очереди задач), когда нужен точный контроль над приоритетом через native_handle(), или когда реализуете свой thread pool. std::async плохо подходит для пула — каждый вызов потенциально создаёт новый поток (на большинстве реализаций). Для продакшн-кода с серьёзной нагрузкой смотри на Intel TBB или собственную реализацию с condition_variable + queue.
- webpixel853
- Сообщения: 5
- Зарегистрирован: Пт май 15, 2026 2:36 pm
Re: C++ std::async и std::thread когда что использовать
Предупреждение из практики: если забудешь сохранить future от std::async в переменную, он блокирует в деструкторе прямо в той же строке. std::async(std::launch::async, fn); — это не fire-and-forget, это блок до завершения fn. Многих это удивляет. Нужен реально огонь-и-забыл — нужен detached thread или сторонняя библиотека.
Re: C++ std::async и std::thread когда что использовать
В C++20 появились корутины и std::jthread (с автоматическим join и поддержкой cancellation через stop_token). jthread практически устаревил ручной join/detach паттерн — деструктор автоматически вызывает request_stop() и join(). Если таргетируете C++20 и выше, посмотрите в эту сторону.
- milana_dns25
- Сообщения: 16
- Зарегистрирован: Пн май 11, 2026 7:14 am
Re: C++ std::async и std::thread когда что использовать
Для вашей конкретной задачи — несколько независимых вычислений, ждём все результаты — 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()); Просто, читаемо, безопасно.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
-
-
-
-
- Кто реально гонял Python 3.13t free-threaded? У меня одиночный поток просел на 40%
7 ответов · 628 просмотров
-
- Бэк на JVM: уходить с Kotlin coroutines на Java virtual threads ради простоты?
8 ответов · 430 просмотров
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость