Разрушение блока параметров
int pthread_condattr_destroy(pthread_condattr_t* attr);
Функция разрушает блок параметров условной переменной, на которые указывает
attr
, после чего он уже не может использоваться без повторной инициализации.
На практике разрушение параметров объекта синхронизации не имеет особого смысла. Вы всегда можете переопределить атрибуты, содержащиеся в переменной
attr
, для инициализации других условных переменных.
Возвращаемые значения:
EOK
— успешное завершение;
EINVAL
— неверный аргумент
attr.
Инициализация условной переменной
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_init(pthread_cond_t* cond, pthread_condattr_t* attr);
Инициализирует условную переменную
cond
со значениями, установленными атрибутами
attr
. Вместо прямого вызова функции
pthread_cond_init()
для начальной инициализации статических условных переменных (глобальных на уровне файла кода или пространства имен
namespace
либо явно описанных с квалификатором
static
) можно воспользоваться макросом
PTHREAD_COND_INITIALIZER
.
Возвращаемые значения:
EOK
— успешное завершение;
EAGAIN
— нет свободных системных объектов синхронизации;
EBUSY
— переменная
cond
уже инициализирована и не разрушалась;
EFAULT
— ошибка доступа ядра к объектам
cond
или
attr
;
EINVAL
— неправильное значение переменной
cond
.
Ожидание условия
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
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.
Выполнение условия