Classe condition_variable
Usare la classe condition_variable
per attendere un evento quando si ha un mutex
di tipo unique_lock<mutex>
. Gli oggetti di questo tipo possono avere prestazioni migliori rispetto agli oggetti di tipo condition_variable_any<unique_lock<mutex>>.
Sintassi
class condition_variable;
Membri
Costruttori
Nome | Descrizione |
---|---|
condition_variable | Costruisce un oggetto condition_variable . |
Funzioni
Nome | Descrizione |
---|---|
native_handle | Restituisce il tipo specifico per l'implementazione che rappresenta l'handle condition_variable. |
notify_all | Sblocca tutti i thread in attesa dell'oggetto condition_variable . |
notify_one | Sblocca uno dei thread in attesa dell'oggetto condition_variable . |
aspettare | Blocca un thread. |
wait_for | Blocca un thread e imposta un intervallo di tempo dopo il quale il thread viene sbloccato. |
wait_until | Blocca un thread e imposta un tempo massimo dopo il quale il thread viene sbloccato. |
condition_variable
Costruisce un oggetto condition_variable
.
condition_variable();
Osservazioni:
Se non è disponibile memoria sufficiente, il costruttore genera un oggetto system_error che ha un codice di errore not_enough_memory
. Se l'oggetto non può essere costruito perché non è disponibile un'altra risorsa, il costruttore genera un oggetto system_error
che ha un codice di errore resource_unavailable_try_again
.
native_handle
Restituisce il tipo specifico per l'implementazione che rappresenta l'handle condition_variable.
native_handle_type native_handle();
Valore restituito
native_handle_type
viene definito come un puntatore a strutture di dati interne di runtime di concorrenza.
notify_all
Sblocca tutti i thread in attesa dell'oggetto condition_variable
.
void notify_all() noexcept;
notify_one
Sblocca uno dei thread in attesa dell'oggetto condition_variable
.
void notify_one() noexcept;
wait
Blocca un thread.
void wait(unique_lock<mutex>& Lck);
template <class Predicate>
void wait(unique_lock<mutex>& Lck, Predicate Pred);
Parametri
Lck
Oggetto mutex> unique_lock<.
Pred
Qualsiasi espressione che restituisca un valore true
o false
.
Osservazioni:
Il primo metodo si blocca fino a quando l'oggetto condition_variable
non viene segnalato da una chiamata a notify_one o notify_all. Può anche riattivarsi in modo spurio.
Il secondo metodo esegue il codice seguente.
while(!Pred())
wait(Lck);
wait_for
Blocca un thread e imposta un intervallo di tempo dopo il quale il thread viene sbloccato.
template <class Rep, class Period>
cv_status wait_for(
unique_lock<mutex>& Lck,
const chrono::duration<Rep, Period>& Rel_time);
template <class Rep, class Period, class Predicate>
bool wait_for(
unique_lock<mutex>& Lck,
const chrono::duration<Rep, Period>& Rel_time,
Predicate Pred);
Parametri
Lck
Oggetto mutex> unique_lock<.
Rel_time
Un oggetto chrono::duration
che specifica la quantità di tempo prima che il thread venga riattivato.
Pred
Qualsiasi espressione che restituisca un valore true
o false
.
Valore restituito
Il primo metodo restituisce cv_status::timeout
se l'attesa termina quando Rel_time è trascorso. In caso contrario, il metodo restituisce cv_status::no_timeout
.
Il secondo metodo restituisce il valore di Pred.
Osservazioni:
Il primo metodo si blocca finché l'oggetto condition_variable
non viene segnalato da una chiamata a notify_one o notify_all o fino a quando non è trascorso l'intervallo di tempo Rel_time . Può anche riattivarsi in modo spurio.
Il secondo metodo esegue il codice seguente.
while(!Pred())
if(wait_for(Lck, Rel_time) == cv_status::timeout)
return Pred();
return true;
wait_until
Blocca un thread e imposta un tempo massimo dopo il quale il thread viene sbloccato.
template <class Clock, class Duration>
cv_status wait_until(
unique_lock<mutex>& Lck,
const chrono::time_point<Clock, Duration>& Abs_time);
template <class Clock, class Duration, class Predicate>
bool wait_until(
unique_lock<mutex>& Lck,
const chrono::time_point<Clock, Duration>& Abs_time,
Predicate Pred);
cv_status wait_until(
unique_lock<mutex>& Lck,
const xtime* Abs_time);
template <class Predicate>
bool wait_until(
unique_lock<mutex>& Lck,
const xtime* Abs_time,
Predicate Pred);
Parametri
Lck
Oggetto mutex> unique_lock<.
Abs_time
Un oggetto chrono:: time_point.
Pred
Qualsiasi espressione che restituisca un valore true
o false
.
Valore restituito
I metodi che restituiscono un cv_status
tipo restituiscono cv_status::timeout
se l'attesa termina quando Abs_time trascorso. In caso contrario, i metodi restituiscono cv_status::no_timeout
.
Metodi che restituiscono un bool
valore restituito da Pred.
Osservazioni:
Il primo metodo si blocca fino a quando l'oggetto condition_variable
non viene segnalato da una chiamata a notify_one o notify_all oppure fino a che non viene restituito Abs_time
. Può anche riattivarsi in modo spurio.
Il secondo metodo esegue il codice seguente
while(!Pred())
if(wait_until(Lck, Abs_time) == cv_status::timeout)
return Pred();
return true;
Il terzo e il quarto metodo usano un puntatore a un oggetto di tipo xtime
per sostituire l'oggetto chrono::time_point
. L'oggetto xtime
specifica il tempo massimo di attesa di un segnale.