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 после вызова этого члена-функции.
Параметры
(нет)
Возвращаемое значение
v, хранящееся в общем состоянии, как std::move(v).Исключения
Если в общем состоянии, на которое ссылается 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
См. также
| проверяет, содержит ли future общее состояние (публичная член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/thread/future/get