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


Класс condition_variable

Класс condition_variable используется для ожидания события при наличии mutex типа unique_lock<mutex>. Объекты этого типа могут иметь лучшую производительность, чем объекты типа condition_variable_any unique_lock мьютекса>>.<<

Синтаксис

class condition_variable;

Участники

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

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

Функции

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

condition_variable

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

condition_variable();

Замечания

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

native_handle

Возвращает тип реализации, представляющий дескриптор condition_variable.

native_handle_type native_handle();

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

native_handle_type определяется как указатель на внутренние структуры данных среды выполнения с параллелизмом.

notify_all

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

void notify_all() noexcept;

notify_one

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

void notify_one() noexcept;

wait

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

void wait(unique_lock<mutex>& Lck);

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

Параметры

Lck
Объект unique_lock мьютекса>.<

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

Замечания

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

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

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

wait_for

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

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

Параметры

Lck
Объект unique_lock мьютекса>.<

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

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

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

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

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

Замечания

Первый метод блокируется, пока объект не condition_variable будет сигнален вызовом 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 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);

Параметры

Lck
Объект unique_lock мьютекса>.<

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_allAbs_time. Он может также ложно активироваться.

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

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

return true;

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

См. также

Справочник по файлам заголовков
<condition_variable>