Что такое "атрибут" мьютекса 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).
В документации объясняется все, что вам нужно об этих настройках мьютекса.