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