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

В целях согласования со стандартом 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

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, в данный момент заблокирован (любым потоком, включал текущий), эта функция немедленно завершится. Если мьютекс имеет тип