Использование необъявленного идентификатора 'PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP' - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь скомпилировать, используя gcc на macOS 10.14 с gcc в Терминале.

Я включил #define _GNU_SOURCE в начало моей программы на C и #include <pthread.h>

Но когда я использую следующее: gcc input.c -o output -lpthread или -pthread, я получаю следующую ошибку. Я также пытался с -std=c99:

input.c:50:33: error: use of undeclared identifier
'PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP'
pthread_mutex_t request_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;

Вот краткое изложение моего кода:

input.c:

#define _GNU_SOURCE
#include <stdlib.h>
…
#include <pthread.h>

pthread_mutex_t request_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;

int main(int argc, char* argv[])
{
  ...
}

Редактировать

Я смог заставить работать код, удалив _NP в конце PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP. Спасибо за все предложения.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

_GNU_SOURCE не будет ничего делать для раскрытия расширений библиотеки в Mac OS, потому что Mac OS не из проекта GNU и не использует библиотеку GNU C.

В Mac OS макрос выбора функции «открыть расширения» - _DARWIN_C_SOURCE.

Однако, это не обязательно покажет PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; Я не думаю, что это существует. Конечно, существует рекурсивный тип мьютекса PTHREAD_MUTEX_RECURSIVE; только нет инициализатора для статической настройки. Код должен быть перенесен для явного вызова pthread_mutex_init для инициализации его рекурсивных мьютексов.

Другая идея - просто написать код, который не требует рекурсивных мьютексов. Рекурсивные мьютексы предназначены для параллельного программирования по принципу «разброс мозгов». «Ну, я не знаю, есть ли у меня этот замок или нет, поэтому я на всякий случай его возьму». Разумная альтернатива - разработать программу, чтобы вы знали!

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

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

0 голосов
/ 31 октября 2018

PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP - это нестандартное расширение, и, очевидно, MacOS его не поддерживает.

Вместо этого вы должны инициализировать свой мьютекс в начале main():

#include <stdio.h>
#include <string.h>
#include <pthread.h>

pthread_mutex_t request_mutex;

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;
}

int main(int argc, char* argv[])
{
    int r;

    r = init_recursive_mutex(&request_mutex);
    if (r != 0)
    {
        fprintf(stderr, "Failed to initialise request_mutex: %s\n", strerror(r));
        return 1;
    }

    /* ... */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...