Spec-Zone.ru › C++

std::future<T>::get

T get();
(1) (только для шаблонного класса future)
(с C++11)
T& get();
(2) (только для специализации шаблона future<T&>)
(с C++11)
void get();
(3) (только для специализации шаблона future<void>)
(с C++11)

Член-функция get ожидает, пока у future будет готовый результат, и (в зависимости от используемого шаблона) извлекает его. Она по сути вызывает wait() для ожидания результата.

У обобщённого шаблона и двух специализаций шаблонов по одному варианту get. Все три варианта get отличаются только типом возвращаемого значения.

Поведение не определено, если valid() является false перед вызовом этой функции.

Любые общие ресурсы освобождаются. valid() становится false после вызова этого члена-функции.

Параметры

(нет)

Возвращаемое значение

1) Значение v, хранящееся в общем состоянии, как std::move(v).
2) Ссылка, хранящаяся как значение в общем состоянии.
3) Ничего.

Исключения

Если в общем состоянии, на которое ссылается future (например, при вызове std::promise::set_exception()), было сохранёно исключение, то это исключение будет выброшено.

Примечания

Реализации рекомендуется проверять случай, когда valid() является false перед вызовом, и выбрасывать std::future_error с кодом ошибки std::future_errc::no_state.

Пример

#include <chrono>
#include <future>
#include <iostream>
#include <string>
#include <thread>
 
std::string time()
{
    static auto start = std::chrono::steady_clock::now();
    std::chrono::duration<double> d = std::chrono::steady_clock::now() - start;
    return "[" + std::to_string(d.count()) + "s]";
}
 
int main()
{
    using namespace std::chrono_literals;
    {
        std::cout << time() << " launching thread\n";
        std::future<int> f = std::async(std::launch::async, []
        {
            std::this_thread::sleep_for(1s);
            return 7;
        });
        std::cout << time() << " waiting for the future, f.valid() == "
                  << f.valid() << '\n';
        int n = f.get();
        std::cout << time() << " future.get() returned with " << n << ". f.valid() = "
                  << f.valid() << '\n';
    }
 
    {
        std::cout << time() << " launching thread\n";
        std::future<int> f = std::async(std::launch::async, []
        {
            std::this_thread::sleep_for(1s);
            return true ? throw std::runtime_error("7") : 7;
        });
        std::cout << time() << " waiting for the future, f.valid() == "
                  << f.valid() << '\n';
        try
        {
            int n = f.get();
            std::cout << time() << " future.get() returned with " << n
                      << " f.valid() = " << f.valid() << '\n';
        }
        catch (const std::exception& e)
        {
            std::cout << time() << " caught exception " << e.what()
                      << ", f.valid() == " << f.valid() << '\n';
        }
    }
}

Возможный вывод:

[0.000004s] launching thread
[0.000461s] waiting for the future, f.valid() == 1
[1.001156s] future.get() returned with 7. f.valid() = 0
[1.001192s] launching thread
[1.001275s] waiting for the future, f.valid() == 1
[2.002356s] caught exception 7, f.valid() == 0

См. также

valid
проверяет, содержит ли future общее состояние
(публичная член-функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/thread/future/get

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API