Sdílet prostřednictvím


<condition_variable>

Definuje třídy condition_variable a condition_variable_any , které slouží k vytváření objektů, které čekají na splnění podmínky.

Tato hlavička používá Concurrency Runtime (ConcRT), abyste ji mohli používat společně s dalšími mechanismy ConcRT. Další informace o ConcRT naleznete v tématu Concurrency Runtime.

Požadavky

Header:<condition_variable>

Obor názvů: std

Poznámka

V kódu, který je zkompilován pomocí /clr, je tato hlavička blokována.

Poznámky

Kód, který čeká na proměnnou podmínky, musí také použít mutexznak . Volající vlákno musí uzamknout mutex před voláním funkcí, které čekají na proměnnou podmínky. Je mutex pak uzamčen, když volá funkce vrátí. Není mutex uzamčen, dokud vlákno čeká na splnění podmínky. Aby nedošlo k nepředvídatelným výsledkům, musí každé vlákno, které čeká na proměnnou podmínky, používat stejný mutex objekt.

Objekty typu condition_variable_any lze použít s mutexem libovolného typu. Typ mutexu, který se používá, nemusí poskytnout metodu try_lock . Objekty typu condition_variable lze použít pouze s mutex typu unique_lock<mutex>. Objekty tohoto typu mohou být rychlejší než objekty typu condition_variable_any<unique_lock<mutex>>.

Pokud chcete počkat na událost, nejprve uzamkněte mutex a potom zavolejte jednu z wait metod proměnné podmínky. Volání wait blokuje, dokud jiný vlákno nes signalizuje proměnnou podmínky.

Spurious wakeups nastane, když vlákna čekající na proměnné podmínky se odblokují bez odpovídajících oznámení. Pokud chcete rozpoznat takové nepravdivé probuzení, kód, který čeká na splnění podmínky, by měl explicitně zkontrolovat tuto podmínku, když se kód vrátí z funkce čekání. To se obvykle provádí pomocí smyčky; tuto smyčku můžete provést wait(unique_lock<mutex>& lock, Predicate pred) za vás.

while (condition is false)
    wait for condition variable;

condition_variable Třídy condition_variable_any mají tři metody, které čekají na podmínku.

  • wait čeká na nevázané časové období.

  • wait_until čeká na zadané time.

  • wait_for čeká na zadanou time interval.

Každá z těchto metod má dvě přetížené verze. Jeden jen čeká a může se vzbudit nechtěně. Druhý přebírá další argument šablony, který definuje predikát. Metoda nevrací, dokud predikát není true.

Každá třída má také dvě metody, které slouží k upozorňovat proměnnou podmínky, že její podmínka je true.

  • notify_one probudí jedno z vláken, které čekají na proměnnou podmínky.

  • notify_all probudí všechna vlákna, která čekají na proměnnou podmínky.

Funkce a výčty

void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);

enum class cv_status { no_timeout, timeout };

Viz také

Referenční informace k souborům hlaviček
condition_variable – třída
condition_variable_any – třída