Статическая инициализация мьютекса pthreads - PullRequest
18 голосов
/ 28 февраля 2011

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

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

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

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

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

Ответы [ 2 ]

22 голосов
/ 28 февраля 2011

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

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

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

17 голосов
/ 28 февраля 2011

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

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

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

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

...