Основы std::async и std::future
Запускайте задачи асинхронно и получайте их результаты через std::future.
«Основы std::async и std::future» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Асинхронные задачи
std::async асинхронно запускает функцию и возвращает объект std::future, который предоставляет результат. Это более высокоуровневая альтернатива ручному управлению потоками.
Базовое использование
Передайте вызываемый объект и аргументы. std::async возвращает объект std::future<Result>.
#include <future>
int compute() { return 42; }
std::future<int> f = std::async(compute);
int result = f.get(); // blocks until doneПолитики запуска
Первый аргумент управляет моментом выполнения задачи:
std::launch::async— немедленно запустить новый потокstd::launch::deferred— выполнить синхронно при вызове get()- По умолчанию, без политики — выбор делает реализация
auto f = std::async(std::launch::async, compute);Методы std::future
Распространённые операции:
get()— блокирует выполнение до завершения и возвращает результат (только один раз)wait()— блокирует выполнение, но не возвращает результатwait_for(d)/wait_until(t)— ожидание с ограничением времениvalid()— настроен ли этот объект future?
Передача исключений
Если асинхронная задача генерирует исключение, оно сохраняется в объекте future и повторно генерируется при вызове get().
auto f = std::async([] { throw std::runtime_error("oops"); });
try {
f.get();
} catch (const std::exception& e) {
std::cout << e.what();
}Возврат нескольких значений
Упакуйте результат в кортеж, структуру или контейнер.
auto f = std::async([] {
return std::make_pair(42, std::string("hello"));
});
auto [n, s] = f.get();Несколько задач параллельно
Запустите несколько асинхронных задач и дождитесь завершения всех.
auto a = std::async(work_a);
auto b = std::async(work_b);
auto c = std::async(work_c);
std::cout << a.get() + b.get() + c.get();std::promise: ручное создание future
В шаблонах «производитель — потребитель», где потребителю нужен объект future, а производитель работает в другом потоке, используйте std::promise.
std::promise<int> p;
std::future<int> f = p.get_future();
std::thread t([&p] { p.set_value(42); });
std::cout << f.get();
t.join();std::packaged_task
Объединяет вызываемый объект с объектом future. Полезен, когда задача вызывается в другом месте, например в пуле потоков.
shared_future
Объект std::future можно прочитать только один раз. std::shared_future позволяет выполнять чтение нескольким потокам — это удобно для широковещательной передачи результата.
Поведение деструктора
Деструктор объекта future, возвращённого std::async с политикой по умолчанию, может блокировать выполнение до завершения задачи. Учитывайте это в длительных задачах.
За пределами std::async
Для асинхронных решений промышленного уровня рассмотрите библиотеки Boost.Asio, Folly или исполнители и сопрограммы из C++20/23. std::async — это отправная точка.
Быстрая проверка
Что происходит при вызове .get() для объекта std::future?
Итоги
std::async асинхронно запускает функцию; возвращённый объект std::future предоставляет результат и передаёт исключения. Используйте политики запуска для управления выполнением. Для сложных шаблонов применяйте std::promise и std::packaged_task.
Часто задаваемые вопросы
Урок «Основы std::async и std::future» бесплатный?
Да — полный текст урока «Основы std::async и std::future» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Основы std::async и std::future»?
Запускайте задачи асинхронно и получайте их результаты через std::future. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Основы std::async и std::future»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- std::thread: присоединение и отсоединение
- std::mutex, lock_guard и unique_lock
- Условные переменные и шаблоны рабочих потоков
- Основы std::async и std::future