std::future::get
T get(); |
(1) | (miembro solo de la plantilla genérica future )(desde C++11) |
T& get(); |
(2) | (miembro solo de la especialización de plantilla future<T&> )(desde C++11) |
void get(); |
(3) | (miembro solo de la especialización de plantilla future<void> )(desde C++11) |
La función miembro get
espera hasta que el objeto future
tenga un resultado válido y (dependiendo de cual plantilla se use) lo recupera. Efectivamente llama a wait() para poder esperar el resultado.
La plantilla genérica y las dos especializaciones de plantilla, cada una contiene una sola versión de get
. Las tres versiones de get
solamente difieren en el tipo de retorno.
El comportamiento no está definido si valid() es false antes de la llamada a esta función.
Cualquier estado compartido se libera. valid() es false después de llamar a esta función miembro.
Contenido |
[editar] Parámetros
(Ninguno)
[editar] Valor de retorno
v
almacenado en el estado compartido, al igual que std::move(v).[editar] Excepciones
Si una excepción estaba almacenada en el estado compartido referenciado por el objeto futuro (por ejemplo, mediante una llamada a std::promise::set_exception()) entonces la excepción se lanzará.
[editar] Notas
Se incentiva a las implementaciones a detectar el caso cuando valid() sea false antes de la llamada y lanzar std::future_error con un código de error std::future_errc::no_state.
[editar] Ejemplo
#include <thread> #include <future> #include <iostream> #include <string> #include <chrono> 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() << " lanzando hilo\n"; std::future<int> f = std::async(std::launch::async, []{ std::this_thread::sleep_for(1s); return 7; }); std::cout << time() << " a la espera del objeto futuro, f.valid() == " << f.valid() << "\n"; int n = f.get(); std::cout << time() << " future.get() regresó con " << n << ". f.valid() = " << f.valid() << '\n'; } { std::cout << time() << " lanzando hilo\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() << " a la espera del objeto futuro, f.valid() == " << f.valid() << "\n"; try { int n = f.get(); std::cout << time() << " future.get() regresó con " << n << " f.valid() = " << f.valid() << '\n'; } catch(const std::exception& e) { std::cout << time() << " se atrapó excepción " << e.what() << ", f.valid() == " << f.valid() << "\n"; } } }
Posible salida:
[0.000004s] lanzando hilo [0.000461s] a la espera del objeto futuro, f.valid() == 1 [1.001156s] future.get() regresó con 7. f.valid() = 0 [1.001192s] lanzando hilo [1.001275s] a la espera del objeto futuro, f.valid() == 1 [2.002356s] se atrapó excepción 7, f.valid() == 0
[editar] Véase también
Comprueba si el objeto futuro tiene un estado compartido. (función miembro pública) |