Ожидать условную переменную
#include <sys/neutrino.h>int SyncCondvarWait( sync_t *sync,sync_t *mutex );int SyncCondvarWait_r( sync_t *sync,sync_t *mutex );
PTHREAD_COND_INITIALIZER
.libc
Системные вызовы SyncCondvarWait() и SyncCondvarWait_r() блокируют вызывающий поток на объекте синхронизации sync. Если более одного потока оказываются заблокированы, они располагаются в очереди в порядке приоритетов и длительности ожидания. Эти функции эквивалентны, за исключением способа информирования об ошибках.
![]() | Вместо явного использования данных системных вызовов следует рассмотреть возможность использования функций pthread_cond_timedwait() и pthread_cond_wait(). |
Заблокированный поток может быть разблокирован в одном из следующих случаев:
STATE_MUTEX
в ожидании освобождения mutex. Это эквивалентно вызову SyncMutexLock( mutex ). STATE_MUTEX
в ожидании освобождения mutex. Это эквивалентно вызову SyncMutexLock( mutex ). STATE_MUTEX
в ожидании освобождения mutex. Это эквивалентно вызову SyncMutexLock( mutex ). STATE_MUTEX
в ожидании освобождения mutex. Это эквивалентно вызову SyncMutexLock( mutex ). Во всех случаях mutex перезахватывается перед возвращением управления в поток. Если поток переходит в состояние STATE_MUTEX
, действуют правила вызова SyncMutexLock().
Условные переменные используются для блокирования потоков до достижения определенных условий. Ложные пробуждения могут произойти в следствие таймаутов, сигналов, а также одиночных или массовых освобождений условной переменной. По этой причине следует постоянно контролировать состояние ожидаемого условия, даже при успешном завершении функции. Наиболее простой путь – контроль состояния условной переменной в цикле while. Например:
SyncMutexLock( &mutex );while ( some_condition ){SyncCondvarWait( &condvar, &mutex );}SyncMutexUnlock( &mutex );
-1
, код ошибки записывается в errno. Любое другое возвращенное значение считается успешным завершением.EOK
возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.
ЗОСРВ «Нейтрино»
sync_t, pthread_cond_broadcast(), pthread_cond_signal(), pthread_cond_timedwait(), pthread_cond_wait(), pthread_cond_wait_interruptible(), pthread_mutex_lock(), SignalKill(), SyncCondvarSignal(), SyncMutexLock(), SyncTypeCreate(), ThreadCancel(), TimerTimeout()
Предыдущий раздел: Описание API системной библиотеки