Ожидание условия

We use cookies. Read the Privacy and Cookie Policy

Ожидание условия

Простое ожидание

int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);

Вызов функции блокирует вызвавший поток на условной переменной cond и разблокирует мьютекс mutex. Поток блокируется до тех пор, пока другой поток не вызовет функцию разблокирования на условной переменной cond (pthread_cond_signal() или pthread_cond_broadcast()). Мьютекс mutex должен быть захвачен потоком до вызова функции. Поток, блокированный на условной переменной, может быть разблокирован также приходом сигнала или вызовом завершения потока. В любом случае при разблокировании потока и выходе из функции ожидания поток вновь захватывает мьютекс mutex.

Не следует использовать условную переменную с мьютексом, у которого разрешен рекурсивный захват.

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

EOK — успешное завершение ожидания либо ожидание прервано сигналом;

EAGAIN — недостаток системных ресурсов для реализации ожидания на условной переменной;

EFAULT — произошла ошибка при попытке обращения к указателям cond или mutex;

EINVAL — возвращается в следующих ситуациях:

 • не инициализированы переменные, на которые указывают cond или mutex;

 • попытка использования переменной, на которую указывает cond, для нескольких мьютексов;

 • вызвавший поток не владеет указанным мьютексом.

Ожидание с тайм-аутом

#include <time.h>

int pthread_cond_timedwait(pthread_cond_t* cond,

 pthread_mutex_t* mutex, const struct timespec* abstime);

Поведение функции идентично варианту обычного ожидания, за исключением того, что ожидание может завершиться также при наступлении времени, переданного параметром abstime.

Следует помнить, что после наступления времени тайм-аута управление совсем не обязательно вернется к вызвавшему потоку. После наступления этого времени функция переведет поток из состояния блокирования на условной переменной в состояние готовности и предпримет попытку захвата мьютекса. Если мьютекс в это время захвачен другим потоком, вызвавший поток перейдет в состояние блокирования на мьютексе.

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

EOK — успешное завершение ожидания либо ожидание прервано сигналом;

EAGAIN — недостаток системных ресурсов для реализации ожидания на условной переменной;

EFAULT — произошла ошибка при попытке обращения к указателям cond или mutex;

EINVAL — возвращается в следующих ситуациях:

 • не инициализированы переменные, на которые указывают cond или mutex;

 • попытка использования переменной, на которую указывает cond, для нескольких мьютексов;

 • вызвавший поток не владеет указанным мьютексом.

ETIMEDOUT — завершение функции по наступлению времени, указанного в abstime.

Данный текст является ознакомительным фрагментом.