Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 449

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, .

Последовательность внесения изменений

Функции впервые реализованы в выпуске Issue 5. Issue 6