Хотя рекурсивные мьютексы стандартизированы в POSIX, стандарт не определяет для них статический инициализатор (PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
является расширением glibc).
Это означает, что для переносимости вам необходимо инициализировать рекурсивныймьютексы вручную с помощью pthread_mutex_init()
:
int init_recursive_mutex(pthread_mutex_t *mutex)
{
pthread_mutexattr_t attr;
int r;
r = pthread_mutexattr_init(&attr);
if (r != 0)
return r;
r = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
if (r == 0)
r = pthread_mutex_init(mutex, &attr);
pthread_mutexattr_destroy(&attr);
return r;
}
Для мьютексов, которые вы статически инициализируете, вы можете вместо этого инициализировать их с помощью функции, подобной описанной выше, в начале main()
для каждого мьютекса.