Шрифт:
Замечания по использованию
Отсутствуют.
Логическое обоснование
С м. раздел «Логическое обоснование» в описании функции pthread_mutex_init .
Будущие направления
Отсутствуют.
Смотри также
pthread_cond_broadcast , pthread_cond_signal , pthread_cond_timedwait , то м Base Definidons стандартаШЕЕStd 1003.1-2001, <pthread.h>.
Последовательность внесения изменений
Функции впервые реализованы в выпуске 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 <pthread.h>
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 и обеспечивают блокирование вызывающего потока по условной переменной cond; «автоматически» здесь означает «автоматический доступ к мьютексу со стороны другого потока с последующим доступом к условной переменной». Другими словами, если какой-то другой поток может получить мьютекс после его освобождения вызывающим потоком, то результат последующего вызова функции pthread_cond_broadcast или pthread_cond_signal в этом (другом) потоке будет таким, как если бы он имел место после блокирования вызывающего потока.
При успешном выполнении мьютекс будет заблокирован, а владеть им будет вызывающий поток.
При использовании условных переменных всегда существует булев предикат, совместно используемый этими переменными, которые связаны с каждым ожидаемым условием. Это условие становится истинным, если поток должен продолжать выполнение. При использовании функций pthread_cond_timedwait или pthread_cond_wait возможны фиктивные запуски. Поскольку возврат из этих функций не подразумевает ничего, кроме оценки значения упомянутого выше предиката, он должен вычисляться после каждого такого выхода из функции.
Результат использования нескольких мьютексов для параллельно выполняемых операций pthread_cond_timedwait или pthread_cond_wait по одной и той же условной переменной не определен; другими словами, условная переменная связывается с уникальным мьютексом, когда поток ожидает заданного значения условной переменной, и это (динамическое) связывание завершится вместе с завершением ожидания.
Ожидание условия (синхронизированное или нет) представляет собой «точку отмены». Если статус возможности аннулирования дл я потока соответствует значению PTHREAD_CANCEL_DEFERRED, побочным эффектом действий, выполняемых по запросу на аннулирование во время ожидания условия будет повторный захват мьютекса перед вызовом первого обработчика запроса на отмену. Другими словами, результат будет выглядеть так, как если бы поток был разблокирован и получил воз м ожность выполниться до точки выхода из вызова функции pthread_cond_timedwait или pthread_cond_wait, но в этой точке «обнаружил» запрос на от м ену и в м есто возврата к инициатору вызова функции pthread_cond_timedwait или pthread_cond_wait приступил к выполнению действий по аннулированию, которые включают вызов обработчиков этого запроса.
Поток, который был разблокирован по причине отмены в то время, пока он был заблокирован в вызове функции pthread_cond_timedwait или pthread_cond_wait , не будет использовать условный сигнал, который можно направить параллельно на условную переменную, если существуют другие потоки, заблокированные по этой условной переменной.
Функция pthread_cond_timedwait эквивалентна функции pthread_cond_wait , за исключением того, что она возвращает код ошибки, если абсолютное время, заданное пара м етро м abstime, наступит (т.е. системное время станет равным или превысит значение abstime) до того, как будет передано (с помощью сигнала) условие cond, или если абсолютное время, заданное параметром abstime, уже наступило в момент вызова.
C S Если поддерживается опция Clock Selection, условная переменная будет иметь атрибут часов, определяющий механизм, который предназначен для измерения времени, заданного параметром abstime . По истечении заданного времени функция pthread_cond_timedwait освободит и снова захватит мьютекс, адресуемый параметром mutex . Функция pthread_cond_timedwait также представляет собой точку отмены.
Если потоку, ожидающему значения условной переменной, передается сигнал, то при возврате из обработчика сигнала поток возобновит ожидание этой условной переменной (как будто не было никакого прерывания на обработку сигнала) или возвратит нуль вследствие фиктивного запуска.