Namespaces
Variants

std::condition_variable_any:: wait_for

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 Lock, class Rep, class Period >

std:: cv_status wait_for ( Lock & lock,

const std:: chrono :: duration < Rep, Period > & rel_time ) ;
(1) (depuis C++11)
template < class Lock, class Rep, class Period, class Predicate >

bool wait_for ( Lock & lock, const std:: chrono :: duration < Rep, Period > & rel_time,

Predicate pred ) ;
(2) (depuis C++11)
template < class Lock, class Rep, class Period, class Predicate >

bool wait_for ( Lock & lock, std:: stop_token stoken,
const std:: chrono :: duration < Rep, Period > & rel_time,

Predicate pred ) ;
(3) (depuis C++20)

wait_for entraîne le blocage du thread actuel jusqu'à ce que la variable condition soit notifiée, que la durée spécifiée se soit écoulée, ou qu'un réveil intempestif se produise. pred peut être optionnellement fourni pour détecter les réveils intempestifs.

1) Équivalent à return wait_until ( lock, std:: chrono :: steady_clock :: now ( ) + rel_time ) ; .
2,3) En attente qu'une condition spécifique devienne vraie, peut être utilisé pour ignorer les réveils intempestifs.
2) Équivalent à return wait_until ( lock, std:: chrono :: steady_clock :: now ( ) + rel_time, std :: move ( pred ) ) ; .
3) Enregistre * this pour la durée de cet appel, pour être notifié si une demande d'arrêt est effectuée sur stoken 's état d'arrêt associé ; il est alors équivalent à return wait_until ( lock, std :: move ( stoken ) ,
std:: chrono :: steady_clock :: now ( ) + rel_time, std :: move ( pred ) ) ;
.

Immédiatement après que wait_for retourne, lock est verrouillé par le thread appelant. Si cette postcondition ne peut être satisfaite [1] , appelle std::terminate .

  1. Cela peut se produire si la nouvelle acquisition du mutex lève une exception.

Table des matières

Paramètres

lock - un verrou qui doit être verrouillé par le thread appelant
stoken - un jeton d'arrêt pour enregistrer l'interruption
rel_time - la durée maximale d'attente
pred - le prédicat pour vérifier si l'attente peut être terminée
Exigences de type
-
Lock doit satisfaire aux exigences de BasicLockable .
-
Predicate doit satisfaire aux exigences de FunctionObject .
-
pred ( ) doit être une expression valide, et son type et sa catégorie de valeur doivent satisfaire aux BooleanTestable exigences.

Valeur de retour

1) std:: cv_status :: timeout si rel_time s'est écoulé depuis le début de cet appel, sinon std:: cv_status :: no_timeout .
2,3) Le dernier résultat de pred ( ) avant de retourner à l'appelant.

Exceptions

1) Exceptions liées au délai d'attente.
2,3) Exceptions liées au délai d'attente, et toute exception levée par pred .

Notes

Même si notifié sous verrou, la surcharge (1) ne fournit aucune garantie concernant l'état du prédicat associé lors du retour dû au délai d'attente.

Les effets de notify_one() / notify_all() et chacune des trois parties atomiques de wait() / wait_for() / wait_until() (déverrouillage+attente, réveil et verrouillage) se produisent dans un ordre total unique qui peut être considéré comme l'ordre de modification d'une variable atomique : cet ordre est spécifique à cette variable conditionnelle individuelle. Cela rend impossible, par exemple, que notify_one() soit retardé et débloque un thread qui a commencé à attendre juste après l'appel à notify_one() ait été effectué.

Exemple

#include <chrono>
#include <condition_variable>
#include <iostream>
#include <thread>
std::condition_variable_any cv;
std::mutex cv_m; // Ce mutex est utilisé à trois fins :
                 // 1) synchroniser les accès à i
                 // 2) synchroniser les accès à std::cerr
                 // 3) pour la variable condition cv
int i = 0;
void waits()
{
    std::unique_lock<std::mutex> lk(cv_m);
    std::cerr << "En attente... \n";
    cv.wait(lk, []{ return i == 1; });
    std::cerr << "...fin de l'attente. i == 1\n";
}
void signals()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    {
        std::lock_guard<std::mutex> lk(cv_m);
        std::cerr << "Notification...\n";
    }
    cv.notify_all();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    {
        std::lock_guard<std::mutex> lk(cv_m);
        i = 1;
        std::cerr << "Nouvelle notification...\n";
    }
    cv.notify_all();
}
int main()
{
    std::thread t1(waits), t2(waits), t3(waits), t4(signals);
    t1.join(); 
    t2.join(); 
    t3.join();
    t4.join();
}

Sortie possible :

En attente...
En attente...
En attente...
Notification...
Nouvelle notification...
...fin de l'attente. i == 1
...fin de l'attente. i == 1
...fin de l'attente. i == 1

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement tel que publié Comportement corrigé
LWG 2093 C++11 les exceptions liées au timeout étaient manquantes dans la spécification mentionne ces exceptions
LWG 2114
( P2167R3 )
C++11 la convertibilité vers bool était trop faible pour refléter les attentes des implémentations exigences renforcées
LWG 2135 C++11 le comportement n'était pas clair si lock. lock ( ) lance une exception appelle std::terminate dans ce cas

Voir aussi

bloque le thread actuel jusqu'à ce que la variable condition soit réveillée
(fonction membre publique)
bloque le thread actuel jusqu'à ce que la variable condition soit réveillée ou jusqu'à ce qu'un point temporel spécifié soit atteint
(fonction membre publique)