PTHREAD_MUTEX_INITIALIZER против pthread_mutex_init (& mutex, param)

52

Есть ли разница между

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Или

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

Насколько я уверен, если я использую только первый метод?

ПРИМЕЧАНИЕ.. Мой вопрос в основном относится к очень маленьким программам, где, в лучшем случае, я должен подключить несколько клиентов к серверу и разрешить их запросы с рабочими потоками.

Теги:
mutex
pthreads

3 ответа

43
Лучший ответ

В более старых версиях стандарта POSIX первый метод с инициализатором гарантирован только для работы со статически назначенными переменными, а не когда переменная является переменной auto, которая определена в теле функции. Хотя я никогда не видел платформы, где это было бы запрещено, даже для переменных auto, и это ограничение было удалено в последней версии стандарта POSIX.

Вариант static действительно предпочтительнее, если вы можете, так как он позволяет легче писать код начальной загрузки. Всякий раз, когда во время выполнения вы вводите код, который использует такой мьютекс, вы можете быть уверены, что мьютекс инициализирован. Это ценная информация в многопоточном контексте.

Метод, использующий функцию init, является предпочтительным, когда вам нужны специальные свойства для вашего мьютекса, такие как рекурсивные, например, или совместное использование между процессами не только между потоками.

5

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

Нет ничего плохого в статическом подходе, если это соответствует вашим потребностям.

  • 0
    «Кроме того, вы можете использовать динамический метод, только если вы добавляете несколько мьютексов во время выполнения». Итак, что это значит? Небольшой пример, если это не легко объяснить?
  • 1
    @ Kalec: если ваш мьютекс выделен функцией malloc() (или принадлежит выделенному объекту).
Показать ещё 1 комментарий
2

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

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

Эффект должен быть эквивалентен динамической инициализации вызовом pthread_mutex_init() с параметром attr, определенным как NULL, за исключением того, что не выполняются проверки ошибок.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню