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