Namespaces
Variants

std:: promise

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
promise
(C++11)
(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 R > class promise ;
(1) (desde C++11)
template < class R > class promise < R & > ;
(2) (desde C++11)
template <> class promise < void > ;
(3) (desde C++11)
1) Plantilla base.
2) Especialización no vacía, utilizada para comunicar objetos entre hilos.
3) especialización void, utilizada para comunicar eventos sin estado.

La plantilla de clase std::promise proporciona un mecanismo para almacenar un valor o una excepción que posteriormente se adquiere de forma asíncrona a través de un objeto std::future creado por el objeto std::promise . Nótese que el objeto std::promise está diseñado para ser utilizado una sola vez.

Cada promesa está asociada con un estado compartido , que contiene cierta información de estado y un resultado que puede no estar evaluado aún, evaluado a un valor (posiblemente void) o evaluado a una excepción. Una promesa puede hacer tres cosas con el estado compartido:

  • make ready : la promesa almacena el resultado o la excepción en el estado compartido. Marca el estado como listo y desbloquea cualquier hilo que esté esperando en un future asociado al estado compartido.
  • release : la promesa renuncia a su referencia al estado compartido. Si esta era la última referencia de este tipo, el estado compartido se destruye. A menos que se tratara de un estado compartido creado por std:: async que aún no esté listo, esta operación no se bloquea.
  • abandon : la promesa almacena la excepción de tipo std::future_error con código de error std::future_errc::broken_promise , hace que el estado compartido esté ready , y luego lo releases .

La promesa es el extremo de "empuje" del canal de comunicación promesa-futuro: la operación que almacena un valor en el estado compartido sincroniza-con (como se define en std::memory_order ) el retorno exitoso de cualquier función que esté esperando en el estado compartido (como std::future::get ). El acceso concurrente al mismo estado compartido puede generar conflictos de otra manera: por ejemplo, múltiples llamadas a std::shared_future::get deben ser todas de solo lectura o proporcionar sincronización externa.

Contenidos

Funciones miembro

construye el objeto promise
(función miembro pública)
destruye el objeto promise
(función miembro pública)
asigna el estado compartido
(función miembro pública)
intercambia dos objetos promise
(función miembro pública)
Obteniendo el resultado
retorna un future asociado con el resultado prometido
(función miembro pública)
Estableciendo el resultado
establece el resultado a un valor específico
(función miembro pública)
establece el resultado a un valor específico mientras entrega la notificación solo al finalizar el hilo
(función miembro pública)
establece el resultado para indicar una excepción
(función miembro pública)
establece el resultado para indicar una excepción mientras entrega la notificación solo al finalizar el hilo
(función miembro pública)

Funciones no miembro

especializa el algoritmo std::swap
(plantilla de función)

Clases auxiliares

especializa el rasgo de tipo std::uses_allocator
(especialización de plantilla de clase)

Ejemplo

Este ejemplo muestra cómo promise<int> puede ser utilizado como señales entre hilos.

#include <chrono>
#include <future>
#include <iostream>
#include <numeric>
#include <thread>
#include <vector>
void accumulate(std::vector<int>::iterator first,
                std::vector<int>::iterator last,
                std::promise<int> accumulate_promise)
{
    int sum = std::accumulate(first, last, 0);
    accumulate_promise.set_value(sum); // Notificar future
}
void do_work(std::promise<void> barrier)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    barrier.set_value();
}
int main()
{
    // Demostrar el uso de promise<int> para transmitir un resultado entre hilos.
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
    std::promise<int> accumulate_promise;
    std::future<int> accumulate_future = accumulate_promise.get_future();
    std::thread work_thread(accumulate, numbers.begin(), numbers.end(),
                            std::move(accumulate_promise));
    // future::get() esperará hasta que el future tenga un resultado válido y lo recuperará.
    // No es necesario llamar a wait() antes de get()
    // accumulate_future.wait(); // esperar por el resultado
    std::cout << "result=" << accumulate_future.get() << '\n';
    work_thread.join(); // esperar por la finalización del hilo
    // Demostrar el uso de promise<void> para señalizar estado entre hilos.
    std::promise<void> barrier;
    std::future<void> barrier_future = barrier.get_future();
    std::thread new_work_thread(do_work, std::move(barrier));
    barrier_future.wait();
    new_work_thread.join();
}

Salida:

result=21