Daily bit(e) C++. std::async

Добавлено 23 октября 2026 в 05:49

Daily bit(e) C++ 157, простой инструмент из C++11 для отложенного выполнения – std::async.

Daily bit(e) C++

Представленный в C++11 механизм std::async – это простой инструмент для запуска асинхронных задач, позволяющий выполнять их параллельно или откладывать их выполнение до момента обращения к результату в том же потоке.

Преимущество std::async заключается в его простоте: он напрямую возвращает объект std::future. Однако за эту простоту приходится платить ограниченными возможностями управления процессом выполнения.

#include <future>
#include <thread>
#include <chrono>

using namespace std::literals;

// Запустить задачу асинхронно (в потоке)
auto result = std::async(std::launch::async,[](){
    std::this_thread::sleep_for(200ms);
});

// Дождаться завершения задачи
result.wait();

// std::async возвращает std::future
auto future = std::async(std::launch::async, [](){
    // медленная операция
    return 42;
});

// Дождаться появления результата, а затем получить его
auto value = future.get();
// value == 42

// Отложенная стратегия выполнения запустит упакованную задачу
// в том потоке, в котором был вызван get()/wait().
{    
auto deferred = std::async(std::launch::deferred, [](){});
// Запустить задачу в этом потоке.
deferred.wait();
}

{
auto deferred = std::async(std::launch::deferred, [](){});
// Ничто не мешает нам перенести future в другой поток
std::jthread([handle=std::move(deferred)](){
    // Выполнить отложенную задачу в этом новом потоке
    handle.wait(); 
});
}

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование