В более старых версиях стандарта POSIX первый метод с инициализатором гарантированно работает только со статически распределенными переменными, а не тогда, когда переменная является auto
переменной, которая определена в теле функции. Хотя я никогда не видел платформы, где это было бы запрещено даже для auto
переменных, и это ограничение было снято в последней версии стандарта POSIX.
static
Вариант действительно предпочтительнее , если вы можете, так как он позволяет писать код начальной загрузки гораздо проще. Всякий раз, когда во время выполнения вы вводите код, который использует такой мьютекс, вы можете быть уверены, что мьютекс инициализирован. Это ценная информация в контексте многопоточности.
Метод, использующий функцию инициализации, предпочтительнее, когда вам нужны специальные свойства для вашего мьютекса, такие как рекурсивность, например, или совместное использование между процессами, а не только между потоками.
malloc()
(или принадлежит объекту, который выделен).Я хотел бы процитировать это из этой книги :
источник
В случаях, когда подходят атрибуты мьютексов по умолчанию, для инициализации мьютексов можно использовать макрос PTHREAD_MUTEX_INITIALIZER.
Если вы хотите указать атрибуты для мьютекса, используйте динамическую инициализацию ........
Эффект должен быть эквивалентен динамической инициализации путем вызова pthread_mutex_init () с параметром attrs, заданным как NULL, за исключением того, что проверки ошибок не выполняются.
источник