Статическая инициализация мьютекса 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;
}
Во всех этих случаях они правильно настроены, прежде чем пытаться их использовать. На самом деле, я бы сделал это хорошо, прежде чем делать какие-то многопоточности, но я просто параноик.