<condition_variable>
Définit les classes condition_variable et condition_variable_any servant à créer des objets qui attendent qu’une condition soit true.
Cet en-tête utilise le runtime d’accès concurrentiel (ConcRT) pour pouvoir l’utiliser avec d’autres mécanismes ConcRT. Pour plus d’informations sur ConcRT, consultez Runtime d’accès concurrentiel.
Spécifications
Header :<condition_variable>
Espace de noms : std
Remarque
Dans le code compilé à l’aide de /clr, cet en-tête est bloqué.
Notes
Le code qui attend une variable conditionnelle doit également utiliser un mutex
. Un thread appelant doit verrouiller le mutex
avant d’appeler les fonctions qui attendent la variable conditionnelle. Le mutex
est verrouillé quand la fonction appelée retourne une valeur. Le mutex
n’est pas verrouillé pendant que le thread attend que la condition devienne true. Pour éviter les résultats imprévisibles, chaque thread qui attend une variable conditionnelle doit utiliser le même objet mutex
.
Les objets de type condition_variable_any
peuvent être utilisés avec un mutex de tout type. Le type du mutex utilisé n’a pas besoin de fournir la méthode try_lock
. Les objets de type condition_variable
peuvent uniquement être utilisés avec un mutex de type unique_lock<mutex>
. Les objets de ce type peuvent être plus rapides que les objets de type condition_variable_any<unique_lock<mutex>>
.
Pour attendre un événement, verrouillez d’abord le mutex, puis appelez l’une des méthodes wait
sur la variable conditionnelle. L’appel de wait
se bloque jusqu’à ce qu’un autre thread signale la variable conditionnelle.
Les éveils sans motif se produisent quand les threads qui attendent des variables conditionnelles sont débloqués sans les notifications appropriées. Pour reconnaître ces éveils sans motif, le code qui attend qu’une condition devienne true doit vérifier explicitement cette condition quand il est retourné par une fonction d’attente. Cela s’effectue habituellement en utilisant une boucle ; vous pouvez utiliser wait(unique_lock<mutex>& lock, Predicate pred)
pour effectuer cette boucle à votre place.
while (condition is false)
wait for condition variable;
Les classes condition_variable_any
et condition_variable
ont chacune trois méthodes qui attendent une condition.
wait
attend pendant une période de temps illimitée.wait_until
attend jusqu’à une valeurtime
spécifiée.wait_for
attend pendant une valeurtime interval
spécifiée.
Chacune de ces méthodes a deux versions surchargées. L’une se contente d’attendre et peut s’éveiller sans motif. L’autre accepte un argument de modèle supplémentaire qui définit un prédicat. La méthode ne retourne pas de valeur tant que le prédicat est true
.
Chaque classe a également deux méthodes qui sont utilisées pour informer une variable conditionnelle que sa condition est true
.
notify_one
éveille un des threads en attente de la variable conditionnelle.notify_all
éveille tous les threads en attente de la variable conditionnelle.
Fonctions et énumérations
void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);
enum class cv_status { no_timeout, timeout };
Voir aussi
Informations de référence sur les fichiers d’en-tête
condition_variable, classe
condition_variable_any, classe