PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP Ошибка в QNX 7 - PullRequest
0 голосов
/ 22 ноября 2018

Я портирую код с Linux на QNX 7. PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP используется во многих местах моего кода.В Linux это определяется в pthread.h.В QNX я не могу найти, где это определено.Отсюда выдается ошибка: «PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 'здесь не объявлен (не в функции)».

Как это исправить?

1 Ответ

0 голосов
/ 22 ноября 2018

Хотя рекурсивные мьютексы стандартизированы в 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() для каждого мьютекса.

...