Condividi tramite


<condition_variable>

Definisce le classi condition_variable e condition_variable_any che vengono usate per creare oggetti che attendono che una condizione diventi true.

Questa intestazione usa il runtime di concorrenza (ConcRT) in modo da essere utilizzabile con altri meccanismi ConcRT. Per altre informazioni su ConcRT, vedere Runtime di concorrenza.

Requisiti

Intestazione:<condition_variable>

Spazio dei nomi: std

Nota

Nel codice compilato tramite /clr questa intestazione è bloccata.

Osservazioni:

Il codice che è in attesa di una variabile di condizione deve usare anche un mutex. Un thread chiamante deve bloccare il mutex prima di chiamare le funzioni di attesa per la variabile di condizione. In seguito il mutex viene bloccato quando la funzione chiamata viene restituita. Il mutex non risulta bloccato mentre il thread è in attesa che la condizione diventi true. Per far sì che non vi siano risultati imprevedibili, tutti i thread in attesa di una variabile di condizione devono usare lo stesso oggetto mutex.

Gli oggetti di tipo condition_variable_any possono essere usati con un mutex di qualsiasi tipo. Il tipo di mutex usato non deve necessariamente specificare il metodo try_lock. Gli oggetti di tipo condition_variable possono essere usati solo con un mutex di tipo unique_lock<mutex>. Gli oggetti di questo tipo possono risultare più veloci rispetto agli oggetti di tipo condition_variable_any<unique_lock<mutex>>.

Per attendere un evento, per prima cosa bloccare il mutex e quindi chiamare uno dei metodi wait sulla variabile di condizione. La chiamata wait si blocca fino a quando un altro thread segnala la variabile di condizione.

Si verificano riattivazioni spurie quando i thread in attesa di variabili di condizione si sbloccano senza le notifiche appropriate. Per riconoscere tali riattivazioni spurie, il codice che è in attesa che una condizione diventi true deve verificare in modo esplicito la condizione quando il codice viene restituito da una funzione di attesa. Ciò avviene solitamente usando un ciclo. Per eseguire il ciclo, è possibile usare wait(unique_lock<mutex>& lock, Predicate pred).

while (condition is false)
    wait for condition variable;

Le classi condition_variable_any e condition_variable hanno tre metodi che attendono una condizione.

  • wait attende per un periodo di tempo illimitato.

  • wait_until attende fino a una condizione time specifica.

  • wait_for attende una condizione time interval specifica.

Ognuno di questi metodi ha due versioni di overload. Una si limita ad attendere e può riattivarsi in modo spurio. L'altra accetta un argomento di modello aggiuntivo che definisce un predicato. Il metodo non restituisce alcun valore finché il predicato non è true.

Ogni classe include anche due metodi che vengono usati per notificare a una variabile di condizione che la condizione è true.

  • notify_one attiva uno dei thread in attesa della variabile di condizione.

  • notify_all attiva tutti i thread in attesa della variabile di condizione.

Funzioni ed Enumerazioni

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

enum class cv_status { no_timeout, timeout };

Vedi anche

Riferimento file di intestazione
Classe condition_variable
Classe condition_variable_any