threads thread pthread libreria funciones examples c pthreads mutex static-initialization

funciones - pthread libreria



Estática pthreads mutex inicialización (2)

Usando pthreads, ¿cómo uno, en C, inicializa una matriz estática de mutexes?

Para una sola exclusión mutua estática, parece que puedo usar PTHREAD_MUTEX_INITIALIZER. Pero ¿qué pasa con una matriz estática de ellos? Como, por ejemplo, en

#include <pthread.h> #define NUM_THREADS 5 /*initialize static mutex array*/ static pthread_mutex_t mutexes[NUM_THREADS] = ...?

¿O deben ser asignados dinámicamente?


No, no tienes que crearlos dinámicamente. Puedes usar una matriz estática, solo tienes que configurarlos todos antes de usarlos. Tu puedes hacer:

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

que es propenso a errores si alguna vez cambia NUM_THREADS , aunque eso puede solucionarse con algo como:

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))

Alternativamente, puedes hacerlo con código, como por ejemplo:

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

En todos esos casos, están configurados correctamente antes de intentar usarlos. De hecho, lo haría bien antes de que hagas cualquier cosa con hilos, pero eso es solo que soy paranoico.


Si tiene un compilador conforme a C99, puede usar P99 para hacer su inicialización:

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

Esto solo repite la secuencia del token PTHREAD_MUTEX_INITIALIZER, el número de veces solicitado.

Para que esto funcione, solo tiene que asegurarse de que NUM_THREADS no se expanda a una variable sino a una constante de entero decimal que sea visible para el preprocesador y que no sea demasiado grande.