что такое "атрибут" мьютекса pthread? - PullRequest
23 голосов
/ 23 ноября 2010

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

Ответы [ 4 ]

34 голосов
/ 23 ноября 2010

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

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

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

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

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

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

4 голосов
/ 23 ноября 2010

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

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
1 голос
/ 23 ноября 2010

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

0 голосов
/ 23 ноября 2010

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

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

...