Для осуществления синхронизации используется только сама условная переменная
Если атрибуты условной переменной, действующие по умолчанию, заранее определены, для инициализации условных переменных, которые создаются статически, можно использовать макрос PTHREAD_COND_INITIALIZER. Результат в это
Возвращаемые значения
При успешно
Проверка на наличие ошибок с кодами [EBUSY] и [EINVAL] реализована так (если реализована вообще), как будто она выполняется в самом начале работы каждой функции, и код ошибки в случае ее обнаружения возвращается до модификации состояния условной переменной, заданной параметром
Ошибки
Функция pthread_cond_destroy () может завершиться неудачно, если:
[EBUSY] реализация обнаружила попытку разрушить объект, адресуемый параметром cond, который относится к другому потоку (например, при использовании в функциях pthread_cond_wait() или pthread_cond_timedwait ());
[EINVAL] значение, заданное пара
Функция pthread_cond_init () завершится неудачно, если:
[EAGAIN] система испытывает недостаток в ресурсах (не имеется в виду память), необходимых для инициализации еще одной условной переменной;
[ENOMEM] для инициализации условной переменной недостаточно существующей памяти.
Функция pthread_cond_init () может завершиться неудачно, если:
[EBUSY] реализация обнаружила попытку повторно инициализировать объект условной переменной, адресуемый параметром cond, которой был ранее инициализирован, но еще не разрушен;
[ EINVAL ] значение, заданное параметром аttr, недействительно.
Примеры
Условную пере
struct list {
pthread_mutex_t lm;
}
struct elt {
key k;
int busy;
pthread_cond_t notbusy;
}
/* Находим элемент списка и сохраняем его. */
struct elt * list_find (struct list *lp, key k) {
struct elt *ep;
pthread_mutex_lock (&lp->lm);
while ((ep = find_elt (1, к) ! = NULL) && ep->busy)
pthread_cond_wait (&ep->notbusy, &lp->lm);
if (ер != NULL) ep->busy = 1;
pthread_mutex_unlock (&lp->lm) ;
return (ер);
}
delete_elt (struct list *lp, struct elt *ep) {
pthread_mutex_lock (&lp->lm);
assert (ep->busy);
//... удаляем элемент ер из списка …
ep->busy = 0; /* Paranoid. */
(A) pthread_cond_broadcast (&ep->notbusy);
pthread_mutex_unlock (&lp->lm);
(B) pthread_cond_destroy (&rp->notbusy);
free (ер);
}
В этом примере условную переменную и ее элемент списка можно освободить (строка В) сразу после того, как все потоки, ожидающие соответствующего значения условной переменной, будут «разбужены» (строка А), поскольку мьютекс и этот код гарантируют, что никакой другой поток не сможет ссылаться на удаляемый элемент.
Замечания по использованию
Отсутствуют.
Логическое обоснование
С
Будущие направления
Отсутствуют.
Смотри также
pthread_cond_broadcast (), pthread_cond_signal (), pthread_cond_timedwait (), то
Последовательность внесения изменений
Функции впервые реализованы в выпуске Issue 5. Включены для согласования с расширение
Issue 6
Функции pthread_cond_destroy() и pthread_cond_init() от
Раздел «Описание» был отредактирован путе
В целях согласования со стандарто