Получить тип мьютекса
#include <pthread.h>
int pthread_mutexattr_gettype( const pthread_mutexattr_t *attr,
int *type );
- attr
- Указатель на объект
pthread_mutexattr_t
, из которого требуется получить атрибут.
- type
- Указатель на область памяти, где функция может хранить тип.
libc
Функция pthread_mutexattr_gettype() получает тип мьютекса из объекта атрибутов мьютекса attr и сохраняет его в type. К допустимым типам мьютексов относятся:
- PTHREAD_MUTEX_NORMAL
- Мьютекс без обнаружения взаимоблокировок. Поток, который пытается повторно заблокировать этот мьютекс без его предварительного разблокирования, блокируется. Попытки разблокировать мьютекс, заблокированный другим потоком, или попытки разблокировать уже разблокированный мьютекс приводят к неопределенному поведению.
- PTHREAD_MUTEX_ERRORCHECK
- Мьютекс с обеспечением проверки ошибок. Поток возвращается с ошибкой, когда он пытается:
- Повторно заблокировать этот мьютекс, не разблокируя его.
- Разблокировать мьютекс, заблокированный другим потоком.
- Разблокировать уже разблокированный мьютекс.
- PTHREAD_MUTEX_RECURSIVE
- Поток, который пытается повторно заблокировать этот мьютекс без его предварительного разблокирования, успешно блокирует мьютекс. Взаимная блокировка, которая может возникнуть с мьютексами типа
PTHREAD_MUTEX_NORMAL
, не может возникнуть с этим типом мьютексов. Множественные блокировки этого мьютекса требуют одинакового количества разблокировок, чтобы освободить мьютекс, прежде чем другой поток сможет захватить мьютекс. Поток, который пытается разблокировать мьютекс, заблокированный другим потоком, или разблокировать уже разблокированный мьютекс, возвращается с ошибкой. - PTHREAD_MUTEX_DEFAULT
- Значение по умолчанию атрибута type. Попытки рекурсивно заблокировать мьютекс этого типа или разблокировать мьютекс этого типа, который не заблокирован вызывающим потоком, или разблокировать мьютекс этого типа, который не заблокирован, приводят к неопределенному поведению.
- EOK
- Успешное завершение.
- EINVAL
- Некорректный объект атрибутов мьютекса attr.
POSIX 1003.1 X/Open Systems Interfaces Extension
- Нет
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Да
- В потоке
- Да
Приложение не должно использовать мьютекс PTHREAD_MUTEX_RECURSIVE
с условными переменными, потому что неявная разблокировка, выполненная для pthread_cond_wait() или pthread_cond_timedwait() может фактически не освобождать мьютекс (если он был заблокирован несколько раз). Если это произойдет, никакой другой поток не сможет удовлетворить условию.
pthread_cond_timedwait(), pthread_cond_wait(), pthread_cond_wait_interruptible(), pthread_mutexattr_settype()
Предыдущий раздел: Описание API системной библиотеки