В соответствии с документацией мьютекс можно инициализировать двумя способами:
Использование функции init:
pthread_mutex_t theMutex;
pthread_mutex_init(&theMutex, NULL);
Использование макроса инициализатора:
pthread_mutex_t result = PTHREAD_MUTEX_INITIALIZER;
О последнем говорится в документации:
В случаях, когда атрибуты mutex по умолчанию подходят, макрос PTHREAD_MUTEX_INITIALIZER можно использовать для инициализации взаимно устаревших мьютексов. Эффект должен быть эквивалентен динамической инициализации вызовом pthread_mutex_init() с параметром attr, указанным как NULL, за исключением того, что не выполняются проверки ошибок.
Означает ли это, что его можно использовать только для статических переменных, а не для локальных переменных?
С++ Конкретный
Я хотел использовать следующую функцию factory:
static pthread_mutex_t GetFastNativeMutex()
{
static pthread_mutex_t result = PTHREAD_MUTEX_INITIALIZER;
return result;
}
Поскольку это позволило бы мне инициализировать мьютексы в списке инициализаторов С++ следующим образом:
MyClass() : myMutex(GetFastNativeMutex()) {}
Это действительно? (Кстати, на практике это работает. Valgrind также не жалуется.)
Update
Если я правильно понял документацию, это должно быть нормально:
#include <pthread.h>
static pthread_mutex_t m0 = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER;
Однако при просмотре вывода препроцессора (используя gcc -E main.cpp
) я вижу следующее:
static pthread_mutex_t m0 = {0x32AAABA7, {0}};
static pthread_mutex_t m1 = {0x32AAABA7, {0}};
static pthread_mutex_t m2 = {0x32AAABA7, {0}};
Оказывается, что три раза был создан один и тот же мьютекс. Что я здесь делаю неправильно?