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

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

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

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

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

(Для м ьютексов типа PTHREAD_MUTEX_RECURS IVE: м ьютекс становится доступным, когда счетчик блокировок достигает нуля, и вызывающий поток больше не имеет никаких блокировок по этому мьютексу.)

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

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

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

Функция pthread_mutex_trylock () возвращает нулевое значение, если выполнена блокировка по объекту мьютекса, адресуемому параметром mutex. В противном случае возвращается код ошибки, обозначающий ее характер.

Ошибки

Функции pthread_mutex_lock () и pthread_mutex_trylock () завершатся неудачно, если:

[EINVAL] мьютекс был создан с использованием атрибута protocol, имеющего значение PTHREAD_PRIO_PROTECT, а приоритет вызывающего потока выше текущего значения предельного приоритета мьютекса.

Функция pthread_mutex_trylock () завершится неудачно, если:

[EBUSY] мьютекс остался недоступным, поскольку он был уже заблокирован.

Функции pthread_mutex_lock() , pthread_mutex_trylock()

и pthread_mutex_unlock () м огут завершиться неудачно, если:

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

XSI [EAGAIN] мьютекс остался недоступным, поскольку было превышено максимальное количество рекурсивных блокировок для мью-текса, заданного параметром mutex.

Функция pthread_mutex_lock () м ожет завершиться неудачно, ес л и:

[ EDEADLK ]  текущий поток уже владеет мьютексом.

Функция pthread_mutex_unlock () м ожет завершиться неудачно, ес л и:

[ EPERM ]  текущий поток не владеет мьютексом.

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