Что такое "атрибут" мьютекса 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, используются атрибуты по умолчанию.

Ответ 1

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

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

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

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

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

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

Ответ 2

Все атрибуты mutex устанавливаются в объекте атрибута mutex функцией вида:

int pthread_mutexattr_setname(pthread_attr_t *attr, Type t);

Все атрибуты mutex извлекаются из объекта атрибута mutex функцией вида:

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

Ответ 3

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

Ответ 4

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

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