Параллельное и распределенное программирование на С++
Шрифт:
PTHREAD_MUTEX_NORMAL
Мьютекс этого типа не обнаруживает взаи м облокировки. Поток, пытаясь перезаблокировать такой м ьютекс без первоначального его разблокирования, попадает во взаи м облокировку. Попытка разблокировать м ьютекс, заблокированный други м потоко м, приводит к неопределенно м у поведению. Попытка разблокировать незаблокированный м ьютекс также приводит к неопределенно м у поведению.
PTHREAD_MUTEX_ERRORCHECK
Мьютекс
PTHREAD_MUTEX_RECURS IVE
П оток, пытаясь перезаблокировать такой мьютекс без первоначального его разблокирования, успешно его блокирует. Взаимоблокировка, возникаю щ ая в результате переблокирования м ьютексов типа PTHREAD_MUTEX_NORMAL, не м ожет произойти с м ьютекса м и этого типа. Множественное блокирование такого м ьютекса потребует такого же количества разблокировок, которые полностью освободят м ьютекс, прежде чем другой поток сможет его захватить. При попытке разблокировать мьютекс, заблокированный другим потоком, генерируется код ошибки. При попытке разблокировать незаблокированный мьютекс также генерируется код ошибки.
PTHREAD_MUTEX_DEFAULT
Попытка рекурсивного блокирования мьютекса этого типа приводит к неопределенному поведению. Попытка разблокировать мьютекс, не заблокированный вызывающим потоком, приводит к неопределенному поведению. Попытка разблокировать незаблокированный мьютекс также приводит к неопределенному поведению. Реализация может преобразовать мьютекс этого типа в один из других типов мьютексов.
Возвращаемые значения
При успешном завершении функция pthread_mutexattr_gettype возвращает нулевое значение и сохраняет значение атрибута type, считанное из объекта attr, в объекте, адресуемом параметром type; в противном случае она возвращает код ошибки, обозначающий ее характер.
При успешном завершении функция pthread_mutexattr_settype возвращает нулевое значение; в противном случае — код ошибки, обозначающий ее характер.
Ошибки
Функция pthread_mutexattr_settype завершится неудачно, если:
[EINVAL] значение, заданное пара м етро м type, недействительно.
Функции pthread_mutexattr_gettype и pthread_mutexattr_settype могутзавершиться неудачно, если:
[EINVAL] значение, заданное пара м етро м attr, недействительно.
Эти функции не возвра щ ают код ошибки [EINTR].
Примеры
Отсутствуют.
Замечания по использованию
В приложениях пре д лагалось не использовать м ьютекс типа PTHREAD_MUTEX_RECURSIVE с условны м и пере м енны м и, поскольку неявная блокировка, выполненная д ля функций pthread_cond_timedwait или pthread_cond_wait , м ожет в д ействительности не освобо д ить м ьютекс (если он был заблокирован м
Логическое обоснование
Отсутствует.
Будущие направления
Отсутствуют.
Смотри также
pthread_cond_timedwait, том Base Definitions стандарта IEEE Std 1003.1-200l, <pthread.h>.
Последовательность внесения изменений
Функции впервые реализованы в выпуске Issue 5. Issue 6
Приложен список опечаток Open Group Corrigendum U033/3. Был отредактирован раздел «Синопсис» для функции pthread_mutexattr_gettype , в результате чего первый аргумент получил тип const pthread_mutexattr_t*.
В целях согласования со стандартом ISO/IEC 9899: 1999 в прототип функции pthread_mutexattr_gettype было добавлено ключевое слово restrict.
pthread_once
Имя
pthread_once — функция д ина м ической инициализации пакетов.
Синопсис
THR #include <pthread.h>
int pthread_once (pthread_once_t *once_control, void (*init_rout_ne) (void)); pthread_once_t once_control = PTHREAD_ONCE_INIT;
Описание
При перво м обра щ ении к функции pthread_once любы м потоко м процесса с заданны м пара м етро м once_control будет вызвана функция ini t_routine без аргументов. Последующие обра щ ения к функции pthread_once с те м же пара м етро м once_control не вызывают функцию init_routin e. Возвра щ ение из функции pthread_once означает, что функция init_routine выполнена. Пара м етр once_control определяет, вызываласьли соответствую щ ал функция инициализации.
Функция pthread_once не является точкой от м ены. Но если функция init_routine является точкой от м ены, и от м ена таки происходит, то ее воздействие на пара м етр once_control будет таки м, как если бы функция pthread_once никогда не вызывалась.
Константа PTHREAD_ONCE_INIT определяется в заголовке <pthread. h>.
Поведение функции pthread_once будет неопределенны м, если пара м етр once_control и м еет авто м атический класс па м яти (объекты этого класса раз м е щ аются в стеке и инициализируются всякий раз при входе в блок, где они объявлены, иразрушаются при выходе из этого блока) или не инициализирован константой PTHREAD_ONCE_INIT.