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_mutex_init ().
Будущие направления
Отсутствуют.
Смотри также
pthread_cond_broadcast (), pthread_cond_signal (), pthread_cond_timedwait (), то м Base Definidons стандартаШЕЕStd 1003.1-2001, .
Последовательность внесения изменений
Функции впервые реализованы в выпуске Issue 5. Включены для согласования с расширение м POSIX Threads Extension.
Issue 6
Функции pthread_cond_destroy() и pthread_cond_init() от м ече н ы как часть опции Threads.
Раздел «Описание» был отредактирован путе м при м енения интерпретации IEEE PASC Interpretation 1003.1с #34.
В целях согласования со стандарто м ISO/IEC 9899:1999 в прототип функции pthread_cond_init () было добавлено ключевое слово restrict.
pthread_cond_timedwait, pthread_cond_wait
Имя
pthread_cond_timedwait, pthread_cond_wait — функции ожидания условия.
Синопсис
THR
#include
int pthread_cond_timedwait ( pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
int pthread_cond_wait (pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
Описание
Функции pthread_cond_timedwait() и pthread_cond_wait() используются для блокирования потоков по условной переменной. Они вызываются с использованием мьютекса mutex , блокируемого вызывающим потоком; в противном случае результирующее поведение не определено.
Эти функции автоматически освобождают мьютекс mutex и обеспечивают блокирование вызывающего потока по условной переменной