Spec-Zone.ru › C++

std::future<T>::get

Основной шаблон
T get();
(1) (начиная с C++11)
std::future<T&> специализации
T& get();
(2) (начиная с C++11)
std::future<void> специализация
void get();
(3) (начиная с C++11)

Функция-член get ожидает (вызывая wait()), пока общее состояние не будет готово, а затем извлекает значение, хранящееся в общем состоянии (если оно есть). Сразу после вызова этой функции valid() становится false.

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

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

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

Исключения

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

Примечания

Стандарт C++ рекомендует реализациям обнаруживать случай, когда 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() << " f.get() returned " << 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() << " f.get() returned " << 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] f.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

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

Отчёт об ошибке Применён к Поведение в опубликованной версии Правильное поведение
LWG 2096 C++11 перегрузка (1) должна была проверять, является ли T MoveAssignable не требуется

См. также

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

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

Spec-Zone.ru

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