Что такое "атрибут" мьютекса pthread?

Функция pthread_mutex_init позволяет указывать указатель на атрибут. Но мне еще предстоит найти хорошее объяснение того, что такое атрибуты pthread. Я всегда только что поставил NULL. Есть ли смысл в этом аргументе?

Документация для тех из вас, кто забыл это:

PTHREAD_MUTEX_INIT (3) Руководство по функциям библиотеки BSD
Pthread_mutex_init (3)

NAME pthread_mutex_init - создать мьютекс

СИНТАКСИС

 #include <pthread.h>

 int
 pthread_mutex_init(pthread_mutex_t *restrict mutex,
     const pthread_mutexattr_t *restrict attr);

ОПИСАНИЕ Функция pthread_mutex_init() создает новый мьютекс с атрибутами, указанными с помощью attr. Если attr равен NULL, используются атрибуты по умолчанию.

4 ответа

Решение

Лучшее место для поиска этой информации - на страницах стандартов POSIX.

NULL Атрибут mutex дает вам определенный по умолчанию атрибут реализации. Если вы хотите узнать, что можно делать с атрибутами, ознакомьтесь со следующей ссылкой и следуйте инструкциям pthread_mutexattr_* ссылки в SEE ALSO раздел. Обычно по умолчанию это разумный набор атрибутов, но он может варьироваться в зависимости от платформы, поэтому я предпочитаю явно создавать мьютексы с известными атрибутами (лучше для переносимости).

Это для выпуска 7 стандарта, 1003.1-2008. Отправная точка для этого здесь. Нажав на Headers в левом нижнем углу позволит вам перейти к определенной функциональности (в том числе pthreads.h).

Атрибуты позволяют вам установить или получить:

  • тип (взаимоблокировка, обнаружение взаимоблокировки, рекурсия и т. д.).
  • надежность (что происходит, когда вы приобретаете мьютекс, и первоначальный владелец умер, имея его).
  • атрибут общего процесса (для совместного использования мьютекса через границы процесса).
  • протокол (как поток ведет себя с точки зрения приоритета, когда поток с более высоким приоритетом хочет мьютекс).
  • потолок приоритета (приоритет, при котором будет работать критическая секция, способ предотвращения инверсии приоритета).

И, для полноты, есть также вызовы init и destroy, не связанные напрямую с определенным атрибутом, но используемые для их создания.

Все атрибуты мьютекса устанавливаются в объекте атрибута мьютекса с помощью функции вида:

int pthread_mutexattr_setname(pthread_attr_t *attr, Type t);

Все атрибуты мьютекса извлекаются из объекта атрибута мьютекса с помощью функции вида:

int pthread_mutexattr_getname(const pthread_attr_t *attr, Type *t);

где имя и тип определены как в таблице ниже:

Type and Name   Description and Value(s)
int protocol    Define the scheduling classes for mutex locks 
                PTHREAD_PRIO_NONE,PTHREAD_PRIO_PROTECT,
                PTHREAD_PRIO_INHERIT

int pshared Defines whether a mutex is shared with other processes. 
                PTHREAD_PROCESS_SHARED, PTHREAD_PROCESS_PRIVATE

int prioceiling Used for mutex attribute priority ceiling values. 
                See POSIX.1 section 13

int type    Application defined mutex locking
                PTHREAD_MUTEX_NORMAL,PTHREAD_MUTEX_RECURSIVE,
                PTHREAD_MUTEX_ERRORCHECK,PTHREAD_MUTEX_DEFAULT

Если вы прокрутите вниз список функций для <pthread.h>, вы найдете кучу pthread_mutexattr_... функции, в том числе init, destroy и функции для установки различных атрибутов мьютекса. Когда вы проходите NULL мьютекс создается с подходящими значениями по умолчанию для всех этих атрибутов, но если вам нужно изменить определенные атрибуты, вы можете создать pthread_mutexattr_t структурировать и передать его.

Применение NULL к этому аргументу подразумевает использование аргумента по умолчанию. Поэтому по некоторым причинам вы можете захотеть изменить эти настройки по умолчанию (используя pthread_mutexattr_init).

Документация объясняет все, что вам нужно об этих настройках мьютекса.

Другие вопросы по тегам