Инициализация мьютекса - (UNIX) - PullRequest
0 голосов
/ 09 сентября 2010

В следующем коде. A mutex инициализируется. Каково значение NULL .

pthread_mutex_init(&a->monitor,NULL);

Я хочу знать, почему мы передаем NULL в качестве второго параметра.

Ответы [ 3 ]

6 голосов
/ 09 сентября 2010

Второй аргумент - указатель на структуру pthread_mutexattr_t, которая позволяет настроить поведение мьютекса; NULL означает «здесь нет специальных опций, используйте поведение мьютекса по умолчанию».

Большинство параметров мьютекса полезны только в крайних случаях (избегая взаимоблокировок с инверсией приоритетов, разделяя мьютекс между процессами, а не потоками), а более полезные (например, управление рекурсией) были стандартизированы только в редакции POSIX 2008 года, что означает Вы еще не можете положиться на их кроссплатформенность. Ответ Паксдиабло содержит исчерпывающий список.

4 голосов
/ 09 сентября 2010

NULL, как атрибут мьютекса, дает вам определенный по умолчанию атрибут реализации. Если вы хотите узнать, что вы можете делать с атрибутами, проверьте следующую ссылку и перейдите по ссылкам pthread_mutexattr_* в разделе SEE ALSO.

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

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

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

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

2 голосов
/ 09 сентября 2010

Второй аргумент pthread_mutex_init принимает pthread_mutexattr_t в качестве аргумента. Вы можете использовать второй аргумент, чтобы указать атрибуты мьютекса, и если используются его атрибуты мьютекса по умолчанию, равные NULL.

...