Namespaces
Variants

std:: future

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
future
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Определено в заголовочном файле <future>
template < class T > class future ;
(1) (начиная с C++11)
template < class T > class future < T & > ;
(2) (начиная с C++11)
template <> class future < void > ;
(3) (начиная с C++11)

Шаблон класса std::future предоставляет механизм для доступа к результату асинхронных операций:

  • Асинхронная операция (созданная через std::async , std::packaged_task или std::promise ) может предоставить объект std::future создателю этой асинхронной операции.
  • Создатель асинхронной операции может затем использовать различные методы для запроса, ожидания или извлечения значения из std::future . Эти методы могут блокироваться, если асинхронная операция еще не предоставила значение.
  • Когда асинхронная операция готова отправить результат создателю, она может сделать это, модифицируя shared state (например, std::promise::set_value ), который связан с std::future создателя.

Обратите внимание, что std::future ссылается на общее состояние, которое не разделяется с другими асинхронными возвращаемыми объектами (в отличие от std::shared_future ).

Содержание

Функции-члены

создает объект future
(public member function)
уничтожает объект future
(public member function)
перемещает объект future
(public member function)
передает общее состояние из * this в shared_future и возвращает его
(public member function)
Получение результата
возвращает результат
(public member function)
Состояние
проверяет, имеет ли future общее состояние
(public member function)
ожидает доступности результата
(public member function)
ожидает результат, возвращает управление, если результат недоступен в течение указанного времени ожидания
(public member function)
ожидает результат, возвращает управление, если результат недоступен до достижения указанной временной точки
(public member function)

Примеры

#include <future>
#include <iostream>
#include <thread>
int main()
{
    // future из packaged_task
    std::packaged_task<int()> task([]{ return 7; }); // обернуть функцию
    std::future<int> f1 = task.get_future(); // получить future
    std::thread t(std::move(task)); // запустить в потоке
    // future из async()
    std::future<int> f2 = std::async(std::launch::async, []{ return 8; });
    // future из promise
    std::promise<int> p;
    std::future<int> f3 = p.get_future();
    std::thread([&p]{ p.set_value_at_thread_exit(9); }).detach();
    std::cout << "Ожидание..." << std::flush;
    f1.wait();
    f2.wait();
    f3.wait();
    std::cout << "Готово!\nРезультаты: "
              << f1.get() << ' ' << f2.get() << ' ' << f3.get() << '\n';
    t.join();
}

Вывод:

Ожидание...Готово!
Результаты: 7 8 9

Пример с исключениями

#include <future>
#include <iostream>
#include <thread>
int main()
{
    std::promise<int> p;
    std::future<int> f = p.get_future();
    std::thread t([&p]
    {
        try
        {
            // code that may throw
            throw std::runtime_error("Example");
        }
        catch (...)
        {
            try
            {
                // store anything thrown in the promise
                p.set_exception(std::current_exception());
            }
            catch (...) {} // set_exception() may throw too
        }
    });
    try
    {
        std::cout << f.get();
    }
    catch (const std::exception& e)
    {
        std::cout << "Exception from the thread: " << e.what() << '\n';
    }
    t.join();
}

Вывод:

Exception from the thread: Example

Смотрите также

(C++11)
запускает функцию асинхронно (возможно, в новом потоке) и возвращает std::future , который будет содержать результат
(шаблон функции)
ожидает значение (возможно, ссылаемое другими future), которое устанавливается асинхронно
(шаблон класса)