std:: promise
|
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) |
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
|
(C++11)
|
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