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