Структуры pthread мьютексы мьютекс инициализатора против pthread в методе init (&мьютекс, парам)


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

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

или

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

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

Примечание: мой вопрос в основном относится к очень маленьким программам, где самое большее, что я сделаю, это подключить несколько клиентов к серверу и разрешить их запросы с рабочими потоками.

4 66

4 ответа:

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

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

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

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

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

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

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

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

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

С 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 просто использует значения по умолчанию. в любом случае работает, но мы обычно используем динамический (последний) метод.