Namespaces
Variants

std::future<T>:: wait_until

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)
(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
template < class Clock, class Duration >
std:: future_status wait_until ( const std:: chrono :: time_point < Clock,Duration > & timeout_time ) const ;
(depuis C++11)

wait_until attend qu'un résultat soit disponible. Il se bloque jusqu'à ce que le timeout_time spécifié soit atteint ou que le résultat devienne disponible, selon la première éventualité. La valeur de retour indique pourquoi wait_until a retourné.

Si le futur est le résultat d'un appel à async qui a utilisé l'évaluation paresseuse, cette fonction retourne immédiatement sans attendre.

Le comportement est indéfini si valid() est false avant l'appel à cette fonction, ou si Clock ne satisfait pas aux exigences Clock . Le programme est mal formé si std:: chrono :: is_clock_v < Clock > est false . (depuis C++20)

Table des matières

Paramètres

timeout_time - point temporel maximum jusqu'auquel bloquer

Valeur de retour

Constante Explication
future_status::deferred L'état partagé contient une fonction différée utilisant l'évaluation paresseuse, donc le résultat sera calculé uniquement lorsqu'il sera explicitement demandé
future_status::ready Le résultat est prêt
future_status::timeout Le délai d'attente a expiré

Exceptions

Toute exception levée par clock, time_point ou duration durant l'exécution (les horloges, points temporels et durées fournis par la bibliothèque standard ne lèvent jamais d'exception).

Notes

Les implémentations sont encouragées à détecter le cas où valid ( ) == false avant l'appel et à lever une std::future_error avec une condition d'erreur de future_errc::no_state .

La norme recommande que l'horloge associée à timeout_time soit utilisée pour mesurer le temps ; cette horloge n'est pas requise d'être une horloge monotone. Il n'y a aucune garantie concernant le comportement de cette fonction si l'horloge est ajustée de manière discontinue, mais les implémentations existantes convertissent timeout_time de Clock vers std::chrono::system_clock et délèguent à pthread_cond_timedwait POSIX afin que l'attente prenne en compte les ajustements de l'horloge système, mais pas ceux de l'horloge Clock fournie par l'utilisateur. Dans tous les cas, la fonction peut également attendre au-delà du moment où timeout_time a été atteint en raison de délais de planification ou de contention des ressources.


Exemple

#include <chrono>
#include <future>
#include <iostream>
#include <thread>
int main()
{
    std::chrono::system_clock::time_point two_seconds_passed
        = std::chrono::system_clock::now() + std::chrono::seconds(2);
    // Créer un future qui prend 1 seconde à se terminer
    std::promise<int> p1;
    std::future<int> f_completes = p1.get_future();
    std::thread([](std::promise<int> p1)
                { 
                    std::this_thread::sleep_for(std::chrono::seconds(1)); 
                    p1.set_value_at_thread_exit(9); 
                }, 
                std::move(p1)
    ).detach();
    // Créer un future qui prend 5 secondes à se terminer
    std::promise<int> p2;
    std::future<int> f_times_out = p2.get_future();
    std::thread([](std::promise<int> p2)
                { 
                    std::this_thread::sleep_for(std::chrono::seconds(5)); 
                    p2.set_value_at_thread_exit(8); 
                }, 
                std::move(p2)
    ).detach();
    std::cout << "En attente pendant 2 secondes..." << std::endl;
    if (std::future_status::ready == f_completes.wait_until(two_seconds_passed))
        std::cout << "f_completes: " << f_completes.get() << "\n";
    else
        std::cout << "f_completes ne s'est pas terminé !\n";
    if (std::future_status::ready == f_times_out.wait_until(two_seconds_passed))
        std::cout << "f_times_out: " << f_times_out.get() << "\n";
    else
        std::cout << "f_times_out ne s'est pas terminé !\n";
    std::cout << "Terminé !\n";
}

Sortie possible :

En attente pendant 2 secondes...
f_completes: 9
f_times_out ne s'est pas terminé !
Terminé !

Voir aussi

attend que le résultat soit disponible
(fonction membre publique)
attend le résultat, retourne s'il n'est pas disponible après la durée de timeout spécifiée
(fonction membre publique)