Чтение онлайн

ЖАНРЫ

Параллельное и распределенное программирование на С++
Шрифт:

При неудачном выполнении функции pthread_mutex_setprioceiling предельное значение приоритета мьютекса не будет изменено.

Возвращаемые значения

При успешном завершении функции pthread_mutex_getprioceiling и pthread_mutex_setprioceiling возвращают нулевое значение; в противном случае — код ошибки, обозначающий ее характер.

Ошибки

Функции pthread_mutex_getprioceiling и pthread_mutex_setprioceiling могут завершиться неудачно, если:

[EINVAL] приоритет, заданный пара м етро м prioceiling,

не попадает в нужный диапазон:

[EINVAL] значение, заданное пара м етро м mutex, не относится ни к одно м у из существующих мьютексов;

[ EPERM] инициатор вызова не и м еет привиле г ий д л я выпо л нения этой операции.

Эти функции не возвра щ ают код ошибки [EINTR].

Примеры

Отсутствуют.

Замечания по использованию

Отсутствуют.

Логическое обоснование

Отсутствует.

Будущие направления

Отсутствуют.

Смотри также

pthread_mutex_destroy,pthread_mutex_lock,

pthread_mutex_timedlock , то м Base Definitions стандарта IEEE Std 1003.1-2001, <pthread.h>.

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

Функции впервые реализованы в выпуске Issue 5. Включены для согласования с расширением POSIX Threads Extension.

Отмечены как часть группы Realtime Threads Feature Group.

Issue 6

Функции pthread_mutex_getprioceiling и pthread_mutex_setprioceiling отмечены как часть опций Threads и Thread Execution Scheduling.

Код ошибки [ENOSYS] был исключен, поскольку его нет смысла учитывать, если реализация не поддерживает опцию Thread Priority Protection.

Код ошибки [ENOSYS], обозначающий отсутствие поддержки протокола учета приоритета для мьютексов, был исключен. Дело в том, что если реализация предоставляет эти функции (независимо от того, определено ли значение _POSIX_PTHREAD_PRIO_PROTECT), они должны работать так, как отмечено в разделе «Описание», т.е. протокол учета приоритета для мьютексов должен поддерживаться.

В целях согласования со стандартом IEEE Std 1003.1d-1999 в раздел «Смотри также была добавлена функция pthread_mutex_timedlock .

В целях согласования со стандартом ISO/IEC 9899: 1999 в прототипы функции pthread_mutex_getprioceiling и pthread_mutex_setprioceiling было добавлено ключевое слово restrict.

pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock

Имя

pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock — функции блокировки и разблокировки мьютекса.

Синопсис

THR #include <pthread.h>

int pthread_mutex_lock (pthread_mutex_t *.mutex) ; int pthread_mutex_trylock (pthread_mutex_t *mutex); int pthread_mutex_unlock (pthread_mutex_t *mutex);

Описание

Объект

мьютекса, адресуемый параметром mutex, блокируется путем вызова функции pthread_mutex_lock. Если мьютекс уже заблокирован, вызывающий поток блокируется до тех пор, пока мьютекс не станет доступным. При завершении этой операции объект мьютекса, адресуемый параметром mutex, находится в состоянии блокировки, а вызывающий поток является его владельцем.

XSI Ес л и м ьютекс и м еет тип PTHREAD_MUTEX_NORMAL , обнаружение взаимоблокировок не обеспечивается. К взаимоблокировке может привести попытка заблокировать мьютекс повторно. Если поток попытается разблокировать мьютекс, который не заблокирован, дальнейшее ero поведение не определено.

Для мьютексов типа PTHREAD_MUTEX_ERRORCHECK предусмотрена проверка на наличие ошибок. Если поток попытается заблокировать мьютекс, который уже заблокирован, возвращается ошибка. Если поток попытается разблокировать мьютекс, который не заблокирован, возвращается ошибка.

Если мьютекс имеет тип PTHREAD_MUTEX_RECURSIVE, мьютекс должен поддерживать концепцию подсчета блокировок. При первом успешном блокировании мьютекса счетчик блокировок устанавливается равным единице. При каждом очередном блокировании этого мьютекса счетчик блокировок инкрементируется, а при каждом разблокировании — декрементируется. Когда счетчик блокировок достигает нулевого значения, мьютекс становится доступным для других потоков. Если поток попытается разблокировать мьютекс, который не заблокирован, возвращается ошибка.

Если м ьютекс и м еет тип PTHREAD_MUTEX_DEFAULT, попытка рекурсивно заблокировать мьютекс приводит к неопределенному поведению. Попытка разблокировать мьютекс, который не был заблокирован (любым потоком, включал вызывающий), приводит к неопределенному поведению.

Функция pthread_mutex_trylock эквивалентна функции

pthread_mutex_lock , за исключением того, что если объект мьютекса, адресуемый параметром mutex, в данный момент заблокирован (любым потоком, включал текущий), эта функция немедленно завершится. Если мьютекс имеет тип PTHREAD_MUTEX_RECURSIVE , и в данный момент мьютексом владеет вызывающий поток, счетчик блокировок этого мьютекса инкрементируется, а функция pthread_mutex_trylock немедленно возвращает признак успешного завершения.

Функция pthread_mutex_unlock освобождает объект м ьютекса, адресуе м ый пара м етро м mutex.

XSI Способ освобождения зависит от атрибута типа м ьютекса.

Если при вызове функции pthread_mutex_unlock , в результате которого мьютекс стал доступным, существуют потоки, заблокированные по объекту мьютекса, адресуемому параметром мьютекс, то поток-владелец этого мьютекса будет установлен стратегией планирования. XSI

Поделиться с друзьями: