EDEADLK
EINVAL
protocol установлен в значение PTHREAD_PRIO_PROTECT), но приоритет вызвавшего потока выше граничного приоритета, присвоенного мьютексу; поток должен быть блокирован (мьютекс не свободен), а значение поля abs_timeout, показывающее количество наносекунд, меньше нуля или больше 1000 миллионов; переменная, на которую указывает mutex, не является инициированным объектом — мьютексом.ETIMEDOUT
Освобождение мьютекса
int pthread_mutex_unlock(pthread_mutex_t* mutex);
Функция pthread_mutex_unlock()
mutex. Вызвавший поток должен быть владельцем мьютекса. Если есть потоки, блокированные в ожидании освобождения мьютекса, то поток с наивысшим приоритетом (или при равных приоритетах дольше всех ждавший) выходит из блокированного состояния и становится владельцем мьютекса.Для мьютексов, разрешающих рекурсивный захват, функция освобождения должна вызываться столько же раз, сколько и функция захвата.
Возвращаемые значения:
EOK
EINVAL
mutex, не является инициализированным объектом — мьютексом;EPERM
Разрушение объекта мьютекс
int pthread_mutex_destroy(pthread_mutex_t* mutex);
Вызов разрушает объект мьютекс, на который указывает переменная mutex
pthread_mutex_init().Возвращаемые значения:
EOK
EBUSY
- мьютекс захвачен и не может быть разрушен до освобождения;EINVAL
mutex, не является инициированным объектом - мьютексом.Операции, не поддерживаемые POSIX
В native QNX API есть ряд функций работы с мьютексом, которые не определены POSIX-стандартом, однако они могут оказаться весьма полезными. Поскольку тип POSIX-мьютекса порождается от sync_t
#include
int SyncMutexRevive(sync_t* sync);
int SyncMutexRevive_r(sync_t* sync);
Эти функции[36]
предназначены для восстановления мьютекса, который находится в состоянии блокированияDEAD. Мьютекс попадает в состояние DEAD, когда память, использованная при захвате мьютекса, освобождается. Такое может произойти, например, когда умирает поток, захвативший мьютекс, расположенный в разделяемой памяти. В результате вызова вызвавший поток становится владельцем мьютекса, и его счетчик захватов устанавливается в 1 для рекурсивного мьютекса.Ошибки выполнения функции:
ЕFAULT
EINVAL
DEAD;ETIMEDOUT
TimerTimeout()).Определить состояние мьютекса как DEAD
SyncMutexEvent(), которая определяет событие, связанное со «смертью» мьютекса.#include
int SyncMutexEvent(sync_t* sync, struct sigevent* event);
int SyncMutexEvent_r(sync_t* sync, struct sigevent* event);
Данная функция предназначена для установки обработчика ситуации, когда мьютекс попадает в состояние DEAD
DEAD, можно далее с помощью вызова функции SyncMutexRevive().Ошибки выполнения функции:
EAGAIN
EFAULT
sync;EINVAL
sync, не существует.Пример применения мьютекса