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

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

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

#include #define NUM_THREADS 5

/ * инициализировать массив статических мьютексов */
статические мьютексы pthread_mutex_t [NUM_THREADS] = ...?

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

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам