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
Definido en el encabezado <future>
template < class T > class future ;
(1) (desde C++11)
template < class T > class future < T & > ;
(2) (desde C++11)
template <> class future < void > ;
(3) (desde C++11)

La plantilla de clase std::future proporciona un mecanismo para acceder al resultado de operaciones asíncronas:

  • El creador de la operación asíncrona puede entonces utilizar diversos métodos para consultar, esperar o extraer un valor del std::future . Estos métodos pueden bloquearse si la operación asíncrona aún no ha proporcionado un valor.
  • Cuando la operación asíncrona está lista para enviar un resultado al creador, puede hacerlo modificando el estado compartido (por ejemplo, std::promise::set_value ) que está vinculado al std::future del creador.

Tenga en cuenta que std::future hace referencia a un estado compartido que no se comparte con ningún otro objeto de retorno asíncrono (a diferencia de std::shared_future ).

Contenidos

Funciones miembro

construye el objeto future
(función miembro pública)
destruye el objeto future
(función miembro pública)
mueve el objeto future
(función miembro pública)
transfiere el estado compartido desde * this a un shared_future y lo devuelve
(función miembro pública)
Obteniendo el resultado
devuelve el resultado
(función miembro pública)
Estado
verifica si el future tiene un estado compartido
(función miembro pública)
espera a que el resultado esté disponible
(función miembro pública)
espera el resultado, retorna si no está disponible después de la duración de timeout especificada
(función miembro pública)
espera el resultado, retorna si no está disponible hasta que se alcanza el punto de tiempo especificado
(función miembro pública)

Ejemplos

#include <future>
#include <iostream>
#include <thread>
int main()
{
    // future desde un packaged_task
    std::packaged_task<int()> task([]{ return 7; }); // envolver la función
    std::future<int> f1 = task.get_future(); // obtener un future
    std::thread t(std::move(task)); // lanzar en un hilo
    // future desde un async()
    std::future<int> f2 = std::async(std::launch::async, []{ return 8; });
    // future desde una 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 << "Esperando..." << std::flush;
    f1.wait();
    f2.wait();
    f3.wait();
    std::cout << "¡Listo!\nLos resultados son: "
              << f1.get() << ' ' << f2.get() << ' ' << f3.get() << '\n';
    t.join();
}

Salida:

Esperando...¡Listo!
Los resultados son: 7 8 9

Ejemplo con excepciones

#include <future>
#include <iostream>
#include <thread>
int main()
{
    std::promise<int> p;
    std::future<int> f = p.get_future();
    std::thread t([&p]
    {
        try
        {
            // código que puede lanzar excepciones
            throw std::runtime_error("Example");
        }
        catch (...)
        {
            try
            {
                // almacenar cualquier excepción en la promesa
                p.set_exception(std::current_exception());
            }
            catch (...) {} // set_exception() también puede lanzar
        }
    });
    try
    {
        std::cout << f.get();
    }
    catch (const std::exception& e)
    {
        std::cout << "Excepción desde el hilo: " << e.what() << '\n';
    }
    t.join();
}

Salida:

Exception from the thread: Example

Véase también

(C++11)
ejecuta una función asincrónicamente (potencialmente en un nuevo hilo) y devuelve un std::future que contendrá el resultado
(plantilla de función)
espera por un valor (posiblemente referenciado por otros futures) que se establece asincrónicamente
(plantilla de clase)