Все объявления относительно мьютексов находятся в заголовочном файле
, и программный код, их использующий, должен включать директиву:
#include
Параметры мьютекса
Параметры мьютекса хранятся в структуре
pthread_mutexattr_t
, которая определена типом
sync_attr_t
. Эта структура должна быть, создана и определена до инициализации мьютекса, после чего может быть переопределена и использована для других объектов типа мьютекс.
Инициализация параметров
int pthread_mutexattr_init(const pthread_mutexattr_t* attr);
Функция инициализирует структуру атрибутов мьютекса, на которую указывает параметр
attr
. Тип данных
pthread_mutexattr_t
определен в файле
(производный от типа
sync_attr_t
, который в свою очередь определен в файле
) следующим образом:
struct _sync_attr_t {
int protocol;
int flags;
int prioceiling;
int clockid; /* только для condvar */
int reserved[4];
};
После инициализации значения по умолчанию могут быть прочитаны или изменены группой функций, приведенной ниже.
Установка граничного приоритета
int pthread_mutexattr_setprioceiling(
pthread_mutexattr_t* attr, int prioceiling);
int pthread_mutexattr_getprioceiling(
const pthread_mutexattr_t* attr, int* prioceiling);
Эти функции записывают/читают значение приоритета, которое будет присваиваться потоку, захватившему мьютекс, если поле protocol структуры
pthread_mutexattr_t
установлено в значение
PTHREAD_PRIO_PROTECT.
Этот параметр используется для реализации протокола граничного приоритета (Priority Ceiling Protocol), предлагающего альтернативный вариант защиты от инверсии приоритетов там, где наследование приоритетов может быть неэффективно или нежелательно.
Как известно, классический случай инверсии приоритетов может возникать, когда более двух потоков разного приоритета конкурируют и разделяют один общий ресурс. В этой ситуации возможно такое стечение обстоятельств, когда низкоприоритетный поток захватывает ресурс, но позже вытесняется потоком среднего приоритета, а поток с высоким приоритетом блокируется в ожидании освобождения ресурса, захваченного низкоприоритетным потоком. Эта ситуация детально описана в соответствующей главе [4], где приводится сравнительный анализ поведения различных ОС в этой ситуации. Классическим решением этой проблемы является протокол наследования приоритетов, когда ОС распознает ситуацию подобного блокирования и автоматически повышает приоритет вытесненного потока (низкого приоритета) до уровня наивысшего приоритета из числа потоков, ожидающих освобождения ресурса. В результате поток с низким приоритетом не вытесняется, как надлежало бы в соответствии с его изначальным приоритетом, а быстро проходит критическую секцию (освобождая ее), после чего его приоритет возвращается на исходный уровень.