Задать тип мьютекса
#include <pthread.h>
int pthread_mutexattr_settype( pthread_mutexattr_t *attr,
int type );
- attr
- Указатель на объект
pthread_mutexattr_t
, в котором требуется установить атрибут.
- type
- Новый тип; один из следующих:
- PTHREAD_MUTEX_NORMAL
- Мьютекс без обнаружения взаимоблокировок. Поток, который пытается повторно заблокировать этот мьютекс без его предварительного разблокирования, блокируется. Попытки разблокировать мьютекс, заблокированный другим потоком, или попытки разблокировать уже разблокированный мьютекс приводят к неопределенному поведению.
- PTHREAD_MUTEX_ERRORCHECK
- Обеспечивает проверку ошибок. Поток возвращается с ошибкой, когда пытается повторно заблокировать этот мьютекс без его предварительного разблокирования, разблокировать мьютекс, заблокированный другим потоком, или разблокировать разблокированный мьютекс.
- PTHREAD_MUTEX_RECURSIVE
- Поток, который пытается повторно заблокировать этот мьютекс без его предварительного разблокирования, успешно блокирует мьютекс. Взаимная блокировка, которая может возникнуть с мьютексами типа
PTHREAD_MUTEX_NORMAL
, не может возникнуть с этим типом мьютексов. Множественные блокировки этого мьютекса требуют одинакового количества разблокировок, чтобы освободить мьютекс, прежде чем другой поток сможет захватить мьютекс. Поток, который пытается разблокировать мьютекс, заблокированный другим потоком, или разблокировать уже разблокированный мьютекс, возвращается с ошибкой. - PTHREAD_MUTEX_DEFAULT
- Значение по умолчанию атрибута type. Попытки рекурсивно заблокировать мьютекс этого типа или разблокировать мьютекс этого типа, который не заблокирован вызывающим потоком, или разблокировать мьютекс этого типа, который не заблокирован, приводят к неопределенному поведению.
libc
Функция pthread_mutexattr_settype() устанавливает тип мьютекса в объекте атрибутов мьютекса attr на значение, заданное в type.
- EOK
- Успешное завершение.
- EINVAL
- Некорректное значение attr или type.
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_gettype()
Предыдущий раздел: Описание API системной библиотеки