Поделиться через


Класс condition_variable_any

Класс condition_variable_any используется для ожидания события, которое имеет любой тип mutex.

Синтаксис

class condition_variable_any;

Участники

Конструкторы

Имя Описание
condition_variable_any Формирует объект condition_variable_any.

Функции

Имя Описание
notify_all Разблокирует все потоки, которые ожидают объект condition_variable_any.
notify_one Разблокирует один из потоков, которые ожидают объект condition_variable_any.
ждать Блокирует поток.
wait_for Блокирует поток и задает интервал времени, после которого поток разблокируется.
wait_until Блокирует поток и задает максимальный момент времени, в который поток разблокируется.

condition_variable_any

Формирует объект condition_variable_any.

condition_variable_any();

Замечания

При недостатке памяти этот конструктор вызывает объект system_error, имеющий код ошибки not_enough_memory. Если объект не может быть создан из-за недоступности некоторых других ресурсов, конструктор создает объект system_error, имеющий код ошибки resource_unavailable_try_again.

notify_all

Разблокирует все потоки, которые ожидают объект condition_variable_any.

void notify_all() noexcept;

notify_one

Разблокирует один из потоков, которые ожидают объект condition_variable_any.

void notify_one() noexcept;

wait

Блокирует поток.

template <class Lock>
void wait(Lock& Lck);

template <class Lock, class Predicate>
void wait(Lock& Lck, Predicate Pred);

Параметры

Lck
Объект mutex любого типа.

Пред
Любое выражение, возвращающее значение true или false.

Замечания

Первый метод блокируется до оповещения объекта condition_variable_any путем вызова notify_one или notify_all. Он может также ложно активироваться.

Второй метод фактически выполняет следующий код.

while (!Pred())
    wait(Lck);

wait_for

Блокирует поток и задает интервал времени, после которого поток разблокируется.

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);

Параметры

Lck
Объект mutex любого типа.

Rel_time
Объект chrono::duration, указывающий количество времени до активации потока.

Пред
Любое выражение, возвращающее значение true или false.

Возвращаемое значение

Первый метод возвращается cv_status::timeout , если ожидание завершается, когда Rel_time истекает. В противном случае метод возвращает значение cv_status::no_timeout.

Второй метод возвращает значение Pred.

Замечания

Первый метод блокируется до тех пор, пока объект не condition_variable_any будет сигнален вызовом notify_one или notify_all или до истечения интервала времени Rel_time. Он может также ложно активироваться.

Второй метод фактически выполняет следующий код.

while(!Pred())
    if(wait_for(Lck, Rel_time) == cv_status::timeout)
    return Pred();

return true;

wait_until

Блокирует поток и задает максимальный момент времени, в который поток разблокируется.

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);

Параметры

Lck
Объект mutex.

Abs_time
Объект chrono::time_point.

Пред
Любое выражение, возвращающее значение true или false.

Возвращаемое значение

Методы, возвращающие тип, cv_status cv_status::timeout возвращаются, если ожидание завершается, когда Abs_time истекает. В противном случае эти методы возвращают cv_status::no_timeout.

Методы, возвращающие bool возвращаемое значение Pred.

Замечания

Первый метод блокируется, пока объект не condition_variable будет сигнализировать вызовом notify_one или notify_all или до Abs_time. Он может также ложно активироваться.

Второй метод фактически выполняет следующий код.

while(!Pred())
    if(wait_until(Lck, Abs_time) == cv_status::timeout)
    return Pred();

return true;

Третий и четвертый методы используют указатель на объект типа xtime для замены объекта chrono::time_point. Объект xtime задает максимальное время ожидания сигнала.