Подтвердить что ты не робот

Статическая инициализация мьютекса pthreads

Используя pthreads, как бы на C инициализировать статический массив мьютексов?

Для одного статического мьютекса я могу использовать PTHREAD_MUTEX_INITIALIZER. Но что относительно статического массива из них? Как, например,

#include &ltpthread.h&gt
#define NUM_THREADS 5

/*initialize static mutex array*/
static pthread_mutex_t mutexes[NUM_THREADS] = ...?

Или они должны быть распределены динамически?

4b9b3361

Ответ 1

Если у вас есть соответствующий компилятор C99, вы можете использовать P99 для выполнения вашей инициализации:

static pthread_mutex_t mutexes[NUM_THREADS] =
  { P99_DUPL(NUM_THREADS, PTHREAD_MUTEX_INITIALIZER) };

Это просто повторяет последовательность токенов PTHREAD_MUTEX_INITIALIZER, запрошенное количество раз.

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

Ответ 2

Нет, вам не нужно создавать их динамически. Вы можете использовать статический массив, вам просто нужно настроить их все, прежде чем использовать их. Вы можете сделать:

#define NUM_THREADS 5
static pthread_mutex_t mutexes[NUM_THREADS] = {
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER
};

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

static pthread_mutex_t mutexes[] = {
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER,
    PTHREAD_MUTEX_INITIALIZER
};
#define NUM_THREADS (sizeof(mutexes)/sizeof(*mutexes))

В качестве альтернативы вы можете сделать это с помощью кода, например:

#define NUM_THREADS 5
static pthread_mutex_t mutexes[NUM_THREADS];

// Other stuff

int main (void) {
    for (int i = 0; i < NUM_THREADS; i++)
        pthread_mutex_init(&mutexes[i], NULL);
    // Now you can use them safely.

    return 0;
}

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