Espacios de nombres
Variantes
Acciones

std::shared_future

De cppreference.com
< cpp‎ | thread
 
 
Biblioteca de apoyo de concurrencia
Hilos
(C++11)
(C++20)
Espacio de nombres this_thread
(C++11)
(C++11)
(C++11)
Cancelación cooperativa
Exclusión mutua
(C++11)
Gestión genérica de bloqueo
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Variables de condición
(C++11)
Semáforos
Pestillos y barreras
(C++20)
(C++20)
Futuros
(C++11)
(C++11)
shared_future
(C++11)
(C++11)
(C++11)
Recuperación segura
(C++26)
Punteros de riesgo
Tipos atómicos
(C++11)
(C++20)
Inicialización de tipos atómicos
(C++11)(en desuso en C++20)
(C++11)(en desuso en C++20)
Orden de memoria
Funciones independientes para operaciones atómicas
Funciones independientes para indicadores atómicos
 
 
Definido en el archivo de encabezado <future>
template< class T > class shared_future;
(1) (desde C++11)
template< class T > class shared_future<T&>;
(2) (desde C++11)
template<>          class shared_future<void>;
(3) (desde C++11)

La plantilla de clase std::shared_future proporciona un mecanismo para acceder al resultado de las operaciones asincrónicas, similar a std::future, excepto que se permite que varios hilos esperen el mismo estado compartido . A diferencia de std::future, que solo es movible (por lo que solo una instancia puede hacer referencia a un resultado asincrónico en particular), std::shared_future es copiable y varios objetos std::shared_future pueden hacer referencia al mismo estado compartido.

El acceso al mismo estado compartido desde múltiples subprocesos es seguro si cada hilo lo hace a través de su propia copia de un objeto shared_future.

Contenido

[editar] Funciones miembro

Construye el objeto futuro.
(función miembro pública) [editar]
Destruye el objeto std::shared_future.
(función miembro pública)
Asigna el contenido.
(función miembro pública)
Obtener el resultado
Devuelve el resultado.
(función miembro pública) [editar]
Estado
Comprueba si el objeto futuro tiene un estado compartido.
(función miembro pública) [editar]
Espera a que el resultado esté disponible.
(función miembro pública) [editar]
Espera el resultado, regresa si no está disponible durante el tiempo de espera especificado.
(función miembro pública) [editar]
Espera el resultado, regresa si no está disponible hasta que se haya alcanzado el punto de tiempo especificado.
(función miembro pública) [editar]

[editar] Ejemplo

Un objeto shared_future puede usarse para mandar una señal a varios hilos simultáneamente, similar a std::condition_variable::notify_all()

#include <iostream>
#include <future>
#include <chrono>
 
int main()
{   
    std::promise<void> ready_promise, t1_ready_promise, t2_ready_promise;
    std::shared_future<void> ready_future(ready_promise.get_future());
 
    std::chrono::time_point<std::chrono::high_resolution_clock> start;
 
    auto fun1 = [&, ready_future]() -> std::chrono::duration<double, std::milli> 
    {
        t1_ready_promise.set_value();
        ready_future.wait(); // espera a la señal de main()
        return std::chrono::high_resolution_clock::now() - start;
    };
 
 
    auto fun2 = [&, ready_future]() -> std::chrono::duration<double, std::milli> 
    {
        t2_ready_promise.set_value();
        ready_future.wait(); // espera a la señal de main()
        return std::chrono::high_resolution_clock::now() - start;
    };
 
    auto fut1 = t1_ready_promise.get_future();
    auto fut2 = t2_ready_promise.get_future();
 
    auto result1 = std::async(std::launch::async, fun1);
    auto result2 = std::async(std::launch::async, fun2);
 
    // espera a que los hilos estén listos
    fut1.wait();
    fut2.wait();
 
    // los hilos están listos, iniciar el reloj
    start = std::chrono::high_resolution_clock::now();
 
    // mandar una señal a los hilos para que inicien
    ready_promise.set_value();
 
    std::cout << "Hilo 1 recibió la señal "
              << result1.get().count() << " ms después del inicio\n"
              << "Hilo 2 recibió la señal "
              << result2.get().count() << " ms después del inicio\n";
}

Posible salida:

Hilo 1 recibió la señal 0.072 ms después del inicio
Hilo 2 recibió la señal 0.041 ms después del inicio

[editar] Véase también

(C++11)
Ejecuta una función asíncronamente (posiblemente en un nuevo hilo) y devuelve un std::future que contendrá el resultado.
(plantilla de función) [editar]
(C++11)
Espera a un valor que se establece asíncronamente.
(plantilla de clase) [editar]