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

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

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Или

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

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

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

69 голосов | спросил Kalec 14 Jpm1000000pmMon, 14 Jan 2013 18:10:17 +040013 2013, 18:10:17

4 ответа


0

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

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

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

ответил Jens Gustedt 14 Jpm1000000pmMon, 14 Jan 2013 18:44:02 +040013 2013, 18:44:02
0

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

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

ответил Joe 14 Jpm1000000pmMon, 14 Jan 2013 18:16:37 +040013 2013, 18:16:37
0

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

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

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

ответил Ramesh Miriyala 29 52013vEurope/Moscow11bEurope/MoscowFri, 29 Nov 2013 10:29:46 +0400 2013, 10:29:46
0

Я хотел бы процитировать это из этой книги :

  

С потоками POSIX есть два способа инициализации блокировок. В одну сторону   Для этого нужно использовать PTHREAD_MUTEX_INITIALIZER следующим образом:   pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

     

Это устанавливает блокировку на значения по умолчанию и, таким образом, делает блокировку   годные к употреблению. Динамический способ сделать это (т.е. во время выполнения) состоит в том, чтобы сделать вызов pthread_mutex_init() следующим образом:   int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

     

Первым аргументом этой подпрограммы является адрес самой блокировки, а вторым - необязательный набор атрибутов. Узнайте больше об атрибутах   сам; передача значения NULL просто использует значения по умолчанию. В любом случае работает , но   мы обычно используем динамический (последний) метод.

ответил Mari202 8 PMpSun, 08 Apr 2018 22:35:24 +030035Sunday 2018, 22:35:24

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132