condition_variable — Klasa
condition_variable
Użyj klasy , aby poczekać na zdarzenie, gdy masz mutex
typ unique_lock<mutex>
. Obiekty tego typu mogą mieć lepszą wydajność niż obiekty typu condition_variable_any unique_lock<<mutex>>.
Składnia
class condition_variable;
Elementy członkowskie
Konstruktory
Nazwa/nazwisko | opis |
---|---|
condition_variable | condition_variable Tworzy obiekt. |
Funkcje
Nazwa/nazwisko | opis |
---|---|
native_handle | Zwraca typ specyficzny dla implementacji reprezentujący uchwyt condition_variable. |
notify_all | Odblokuje wszystkie wątki oczekujące na condition_variable obiekt. |
notify_one | Odblokuje jeden z wątków oczekujących na condition_variable obiekt. |
czekać | Blokuje wątek. |
wait_for | Blokuje wątek i ustawia interwał czasu, po którym wątek zostanie odblokowany. |
wait_until | Blokuje wątek i ustawia maksymalny punkt w czasie, w którym wątek jest odblokowywany. |
condition_variable
condition_variable
Tworzy obiekt.
condition_variable();
Uwagi
Jeśli za mało pamięci jest dostępna, konstruktor zgłasza obiekt system_error , który zawiera not_enough_memory
kod błędu. Jeśli nie można skonstruować obiektu, ponieważ inny zasób jest niedostępny, konstruktor zgłasza system_error
obiekt, który zawiera resource_unavailable_try_again
kod błędu.
native_handle
Zwraca typ specyficzny dla implementacji, który reprezentuje dojście condition_variable.
native_handle_type native_handle();
Wartość zwracana
native_handle_type
element jest definiowany jako wskaźnik do wewnętrznych struktur danych środowiska uruchomieniowego współbieżności.
notify_all
Odblokuje wszystkie wątki oczekujące na condition_variable
obiekt.
void notify_all() noexcept;
notify_one
Odblokuje jeden z wątków oczekujących na condition_variable
obiekt.
void notify_one() noexcept;
wait
Blokuje wątek.
void wait(unique_lock<mutex>& Lck);
template <class Predicate>
void wait(unique_lock<mutex>& Lck, Predicate Pred);
Parametry
Lck
Obiekt mutex> unique_lock<.
Pred
Dowolne wyrażenie zwracające true
wartość lub false
.
Uwagi
Pierwsza metoda blokuje, dopóki condition_variable
obiekt nie zostanie zasygnalizowany przez wywołanie notify_one lub notify_all. Może również obudzić się złudnie.
W efekcie druga metoda wykonuje następujący kod.
while(!Pred())
wait(Lck);
wait_for
Blokuje wątek i ustawia interwał czasu, po którym wątek zostanie odblokowany.
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);
Parametry
Lck
Obiekt mutex> unique_lock<.
Rel_time
chrono::duration
Obiekt, który określa czas, po jakim wątek się obudzi.
Pred
Dowolne wyrażenie zwracające true
wartość lub false
.
Wartość zwracana
Pierwsza metoda zwraca cv_status::timeout
wartość, jeśli oczekiwanie zakończy się po upływie Rel_time . W przeciwnym razie metoda zwraca cv_status::no_timeout
wartość .
Druga metoda zwraca wartość Pred.
Uwagi
Pierwsza metoda blokuje, dopóki condition_variable
obiekt nie zostanie zasygnalizowany przez wywołanie notify_one lub notify_all lub do czasu upływu przedziału czasu Rel_time . Może również obudzić się złudnie.
W efekcie druga metoda wykonuje następujący kod.
while(!Pred())
if(wait_for(Lck, Rel_time) == cv_status::timeout)
return Pred();
return true;
wait_until
Blokuje wątek i ustawia maksymalny punkt w czasie, w którym wątek jest odblokowywany.
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);
Parametry
Lck
Obiekt mutex> unique_lock<.
Abs_time
Obiekt chrono::time_point .
Pred
Dowolne wyrażenie zwracające true
wartość lub false
.
Wartość zwracana
Metody zwracające cv_status
typ zwracają wartość cv_status::timeout
, jeśli oczekiwanie zakończy się po upływie Abs_time . W przeciwnym razie metody zwracają wartość cv_status::no_timeout
.
Metody zwracające bool
wartość Pred.
Uwagi
Pierwsza metoda blokuje, dopóki condition_variable
obiekt nie zostanie zasygnalizowany przez wywołanie notify_one lub notify_all lub do czasu Abs_time
. Może również obudzić się złudnie.
W efekcie druga metoda wykonuje następujący kod
while(!Pred())
if(wait_until(Lck, Abs_time) == cv_status::timeout)
return Pred();
return true;
Trzecie i czwarte metody używają wskaźnika do obiektu typu xtime
w celu zastąpienia chrono::time_point
obiektu. Obiekt xtime
określa maksymalny czas oczekiwania na sygnał.