2012-06-15 15 views
5

Estoy trabajando en un programa multihilo y tengo una pregunta sobre dónde definir el mutex.C ¿dónde definir un mutex en un programa de multiproceso?

información relevante: el programa tiene un main.c en el que una acción específica determinada de acuerdo con la entrada del usuario. main llama a una función maestra que se encuentra en un archivo llamado master.c. En el archivo master.c creamos los N hilos a lo largo de algunas otras acciones (no relevantes). Los hilos llaman a una función llamada son_threads que se encuentra en un archivo son.c y necesitan usar un mutex cuando entran en una región crítica (editando varias variables globales para evitar condiciones de carrera). Otro archivo que tengo es type.h donde defino varias variables globales que necesito usar.

La declaración de exclusión mutua es:

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 

Así que trataron de definir la exclusión mutua en mi type.h por lo que es visible para los archivos son.c. Cuando intento compilarlo, me da error. Lo cual es correcto ya que estoy definiendo ese mutex en varios archivos.

Pero estoy bastante seguro de que no puedo definir el mutex en el archivo son.c porque cada vez que creo ese hilo, el mutex se inicializará a su configuración predeterminada, no permitiéndome usarlo correctamente. No estoy seguro de esto

La exclusión mutua tiene que ser una variable global, donde los hilos N tienen acceso a ella. Entonces, ¿dónde se supone que debo ponerlo?

No sé si me explico a mí mismo. Estoy intentando lo mejor.

Respuesta

6

Sólo declaran su variable en el archivo .h

extern pthread_mutex_t mutex1; 

y mantener la definicióncon la inicialización en el archivo C. Esto es lo que significa el (los) estándar (s) C.

Para POSIX, la inicialización de la exclusión mutua con el almacenamiento estático es realmente importante. Entonces esa definición no puede vivir en un archivo .h.

1

Si usted debe tener una variable global y compartirlo entre módulos en 'C' Creo que es típica para que se declaró en un archivo de inclusión. En los viejos tiempos, usábamos alguna macro mágica como "GLOBAL" en el archivo .h como "extern" y, en general, redefiníamos GLOBAL como nada de modo que se declarase en main.

#ifndef _TYPES_H 
#define _TYPES_H 

    // types.h 

    #ifndef GLOBAL 
    # define GLOBAL extern 
    #endif 

    GLOBAL my_global mutex; 


#endif 
+0

Ok Entiendo lo que quieres decir. Déjame ver cómo funciona. ¡Gracias por el consejo! – Alessandroempire

+0

No creo que el juego con 'GLOBAL' sirva mucho, aquí. Necesita una declaración en el archivo '.h' y una definición * con inicialización * en' .c'. La inicialización predeterminada para 'pthread_mutex_t' no funcionaría. –

+0

@JensGustedt eso es exactamente lo que acabo de hacer y funcionó. No me di cuenta de que estaba inicializando el mutex en el archivo .h. Un gran error. – Alessandroempire

2

Pero estoy bastante seguro de que no puedo definir la exclusión mutua en el archivo son.c debido a que cada vez que crear ese hilo, el mutex se inicializa a su configuración por defecto, no permitiendo que lo use correctamente . No estoy seguro de esto

Esto no es correcto. Coloque la definición mutex en ese archivo, pero fuera de la función de subprocesos. Se inicializará al inicio del programa, pero no en cada nuevo hilo. Puede poner extern pthread_mutex_t mutex1; en uno de los archivos de encabezado para que los usuarios del mutex que no están en son.c conozcan el mutex.

+0

¡Esa era mi duda! Pensé que cada vez que creara un nuevo hilo, simplemente restablecería el mutex Bueno, eso es una buena noticia. ¡Muchas gracias! – Alessandroempire