condition_variable_any — Klasa
Użyj klasy condition_variable_any
, aby poczekać na zdarzenie, które ma dowolny mutex
typ.
Składnia
class condition_variable_any;
Elementy członkowskie
Konstruktory
Nazwa/nazwisko | opis |
---|---|
condition_variable_any | condition_variable_any Tworzy obiekt. |
Funkcje
Nazwa/nazwisko | opis |
---|---|
notify_all | Odblokuje wszystkie wątki oczekujące na condition_variable_any obiekt. |
notify_one | Odblokuje jeden z wątków oczekujących na condition_variable_any 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_any
condition_variable_any
Tworzy obiekt.
condition_variable_any();
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.
notify_all
Odblokuje wszystkie wątki oczekujące na condition_variable_any
obiekt.
void notify_all() noexcept;
notify_one
Odblokuje jeden z wątków oczekujących na condition_variable_any
obiekt.
void notify_one() noexcept;
wait
Blokuje wątek.
template <class Lock>
void wait(Lock& Lck);
template <class Lock, class Predicate>
void wait(Lock& Lck, Predicate Pred);
Parametry
Lck
mutex
Obiekt dowolnego typu.
Pred
Dowolne wyrażenie zwracające true
wartość lub false
.
Uwagi
Pierwsza metoda blokuje, dopóki condition_variable_any
obiekt nie zostanie zasygnalizowany przez wywołanie notify_one lub notify_all. Może również obudzić się złudnie.
Druga metoda w efekcie 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 Lock, class Rep, class Period>
bool wait_for(Lock& Lck, const chrono::duration<Rep, Period>& Rel_time);
template <class Lock, class Rep, class Period, class Predicate>
bool wait_for(Lock& Lck, const chrono::duration<Rep, Period>& Rel_time, Predicate Pred);
Parametry
Lck
mutex
Obiekt dowolnego typu.
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_any
obiekt nie zostanie zasygnalizowany przez wywołanie notify_one lub notify_all albo do czasu upływu przedziału czasu Rel_time . Może również obudzić się złudnie.
Druga metoda w efekcie 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 Lock, class Clock, class Duration>
void wait_until(Lock& Lck, const chrono::time_point<Clock, Duration>& Abs_time);
template <class Lock, class Clock, class Duration, class Predicate>
void wait_until(
Lock& Lck,
const chrono::time_point<Clock, Duration>& Abs_time,
Predicate Pred);
template <class Lock>
void wait_until(Lock Lck, const xtime* Abs_time);
template <class Lock, class Predicate>
void wait_until(
Lock Lck,
const xtime* Abs_time,
Predicate Pred);
Parametry
Lck
Obiekt mutex.
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 momentu Abs_time. Może również obudzić się złudnie.
Druga metoda w efekcie 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ł.