PIP 5.6.1
Platform-Independent Primitives
Открытые члены | Полный список членов класса
Класс PIConditionVariable

Переменная условия, используемая вместе с внешним PIMutex. Подробнее...

#include <piconditionvar.h>

Открытые члены

 PIConditionVariable ()
 Создает переменную условия.
 
virtual ~PIConditionVariable ()
 Уничтожает переменную условия.
 
void notifyOne ()
 Пробуждает один ожидающий поток, если он есть.
 
void notifyAll ()
 Пробуждает все потоки, ожидающие на этой переменной.
 
virtual void wait (PIMutex &lk)
 Ожидает уведомления, временно освобождая lk на время блокировки.
 
virtual void wait (PIMutex &lk, const std::function< bool()> &condition)
 Ожидает, пока condition не станет истинным, повторно проверяя его после каждого пробуждения при заблокированном lk. Подробнее...
 
virtual bool waitFor (PIMutex &lk, PISystemTime timeout)
 Ожидает не дольше timeout и возвращает true, если пробуждение произошло до его истечения.
 
virtual bool waitFor (PIMutex &lk, PISystemTime timeout, const std::function< bool()> &condition)
 Ожидает, пока condition не станет истинным или не истечет timeout. Подробнее...
 

Подробное описание

Переменная условия, используемая вместе с внешним PIMutex.

Методы

◆ wait()

void PIConditionVariable::wait ( PIMutex lk,
const std::function< bool()> &  condition 
)
virtual

Ожидает, пока condition не станет истинным, повторно проверяя его после каждого пробуждения при заблокированном lk.

Выполнение текущего потока (который должен быть заблокирован с помощью lk методом PIMutex::lock()) приостанавливается до получения уведомления.

В момент блокировки потока функция автоматически вызывает lk.unlock() (PIMutex::unlock()), позволяя другим заблокированным потокам продолжить выполнение.

После получения уведомления (явного, от другого потока) функция разблокируется и вызывает lk.lock() (PIMutex::lock()), возвращая lk в то же состояние, в котором он находился при вызове функции. Затем функция завершается (обратите внимание, что эта последняя блокировка мьютекса может снова заблокировать поток перед возвратом).

Обычно функция пробуждается при вызове в другом потоке либо notifyOne(), либо notifyAll(). Однако некоторые реализации могут создавать ложные пробуждения без вызова любой из этих функций. Поэтому пользователи этой функции должны убедиться, что условие для возобновления выполнено.

Если указано condition, функция блокируется только если condition возвращает false, а уведомления могут разблокировать поток только когда оно станет true (что особенно полезно для проверки ложных пробуждений).

Аргументы
lkобъект блокировки, используемый методом wait для защиты данных
conditionвызываемый объект или функция, не принимающая аргументов и возвращающая значение, которое может быть оценено как bool. Вызывается повторно, пока не примет значение true

◆ waitFor()

bool PIConditionVariable::waitFor ( PIMutex lk,
PISystemTime  timeout,
const std::function< bool()> &  condition 
)
virtual

Ожидает, пока condition не станет истинным или не истечет timeout.

Выполнение текущего потока (который должен быть заблокирован с помощью lk методом PIMutex::lock()) приостанавливается на время timeout, или до получения уведомления (в зависимости от того, что произойдет раньше).

В момент блокировки потока функция автоматически вызывает lk.unlock() (PIMutex::unlock()), позволяя другим заблокированным потокам продолжить выполнение.

После получения уведомления или истечения таймаута функция разблокируется и вызывает lk.lock() (PIMutex::lock()), возвращая lk в то же состояние, в котором он находился при вызове функции. Затем функция завершается (обратите внимание, что эта последняя блокировка мьютекса может снова заблокировать поток перед возвратом).

Обычно функция пробуждается при вызове в другом потоке либо notifyOne(), либо notifyAll(). Однако некоторые реализации могут создавать ложные пробуждения без вызова любой из этих функций. Поэтому пользователи этой функции должны убедиться, что условие для возобновления выполнено.

Если указано condition, функция блокируется только если condition возвращает false, а уведомления могут разблокировать поток только когда оно станет true (что особенно полезно для проверки ложных пробуждений).

Аргументы
lkобъект блокировки, используемый методом wait для защиты данных
timeoutвремя ожидания
conditionвызываемый объект или функция, не принимающая аргументов и возвращающая значение, которое может быть оценено как bool. Вызывается повторно, пока не примет значение true
Возвращает
false если достигнут таймаут, или true если условие пробуждения истинно