0Pricing
C++ Academy · Урок

Основы 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 — локальная установка не требуется.

Все уроки этого курса

  1. std::thread: присоединение и отсоединение
  2. std::mutex, lock_guard и unique_lock
  3. Условные переменные и шаблоны рабочих потоков
  4. Основы std::async и std::future
← Назад к C++ Academy