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
Défini dans l'en-tête <future>
template < class R > class promise ;
(1) (depuis C++11)
template < class R > class promise < R & > ;
(2) (depuis C++11)
template <> class promise < void > ;
(3) (depuis C++11)
1) Modèle de base.
2) Spécialisation non-void, utilisée pour communiquer des objets entre les threads.
3) void specialization, utilisée pour communiquer des événements sans état.

Le modèle de classe std::promise fournit un mécanisme pour stocker une valeur ou une exception qui est ensuite récupérée de manière asynchrone via un objet std::future créé par l'objet std::promise . Notez que l'objet std::promise est destiné à être utilisé une seule fois.

Chaque promesse est associée à un shared state , qui contient des informations d'état et un result qui peut être non encore évalué, évalué à une valeur (éventuellement void) ou évalué à une exception. Une promesse peut effectuer trois actions avec le shared state :

  • make ready : la promesse stocke le résultat ou l'exception dans l'état partagé. Marque l'état comme prêt et débloque tout thread attendant sur un futur associé à l'état partagé.
  • release : la promesse abandonne sa référence à l'état partagé. Si c'était la dernière référence de ce type, l'état partagé est détruit. À moins qu'il ne s'agisse d'un état partagé créé par std:: async qui n'est pas encore prêt, cette opération ne bloque pas.
  • abandon : la promesse stocke l'exception de type std::future_error avec le code d'erreur std::future_errc::broken_promise , rend l'état partagé ready , puis le release .

La promesse est l'extrémité "push" du canal de communication promesse-futur : l'opération qui stocke une valeur dans l'état partagé synchronise-avec (tel que défini dans std::memory_order ) le retour réussi de toute fonction qui attend sur l'état partagé (comme std::future::get ). L'accès concurrent au même état partagé peut entrer en conflit autrement : par exemple, plusieurs appelants de std::shared_future::get doivent soit être tous en lecture seule, soit fournir une synchronisation externe.

Table des matières

Fonctions membres

construit l'objet promise
(fonction membre publique)
détruit l'objet promise
(fonction membre publique)
assigne l'état partagé
(fonction membre publique)
échange deux objets promise
(fonction membre publique)
Obtention du résultat
retourne un future associé au résultat promis
(fonction membre publique)
Définition du résultat
définit le résultat à une valeur spécifique
(fonction membre publique)
définit le résultat à une valeur spécifique en délivrant la notification uniquement à la fin du thread
(fonction membre publique)
définit le résultat pour indiquer une exception
(fonction membre publique)
définit le résultat pour indiquer une exception en délivrant la notification uniquement à la fin du thread
(fonction membre publique)

Fonctions non membres

spécialise l'algorithme std::swap
(modèle de fonction)

Classes d'assistance

spécialise le std::uses_allocator trait de type
(spécialisation de modèle de classe)

Exemple

Cet exemple montre comment promise<int> peut être utilisé comme signaux entre les threads.

#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); // Notify future
}
void do_work(std::promise<void> barrier)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    barrier.set_value();
}
int main()
{
    // Demonstrate using promise<int> to transmit a result between threads.
    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() will wait until the future has a valid result and retrieves it.
    // Calling wait() before get() is not needed
    // accumulate_future.wait(); // wait for result
    std::cout << "result=" << accumulate_future.get() << '\n';
    work_thread.join(); // wait for thread completion
    // Demonstrate using promise<void> to signal state between threads.
    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();
}

Sortie :

result=21