2012-06-15 16 views
5

Sto lavorando a un programma multi-thread e ho una domanda su dove definire il mutex.C dove definire un mutex in un programma multithread?

Informazioni rilevanti: il programma ha uno main.c in cui viene determinata un'azione specifica in base all'input dell'utente. main chiama una master_function che si trova in un file chiamato master.c. Nel file master.c creiamo i thread N insieme ad altre azioni (non rilevanti). I thread chiamano una funzione denominata son_threads che si trova in un file son.c e devono utilizzare un mutex quando entrano in un'area critica (modificando diverse variabili globali per impedire condizioni di competizione). Un altro file che ho è un type.h dove definisco diverse variabili globali che devo usare.

La dichiarazione di mutex è:

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 

Così ho provato a definire il mutex nel mio type.h quindi è visibile ai file son.c. Quando provo a compilare mi dà errore. Quale è corretto poiché sto definendo quel mutex in diversi file.

Ma sono abbastanza sicuro di non riuscire a definire il mutex nel file son.c perché ogni volta che creo quel thread, il mutex verrà inizializzato sull'impostazione predefinita, non permettendomi di usarlo correttamente. Non sono sicuro di questo.

Il mutex deve essere una variabile globale, in cui i thread N possono accedervi. Quindi dove dovrei metterlo?

Non so se mi sto spiegando bene. Sto facendo del mio meglio.

risposta

6

Proprio dichiarare la variabile nel file di .h

extern pthread_mutex_t mutex1; 

e mantenere il definizione con l'inizializzazione nel file C. Questo è come è inteso dallo standard C (s).

Per POSIX, l'inizializzazione del mutex con memoria statica è molto importante. Quindi questa definizione non può vivere in un file .h.

1

Se è necessario disporre di una variabile globale e condividerla tra i moduli in "C", penso che sia tipico dichiararla in un file di inclusione. In passato usavamo alcune macro magiche come "GLOBAL" nel file .h come "extern" e nel main dovevamo ridefinire GLOBAL come nulla che fosse dichiarato in main.

#ifndef _TYPES_H 
#define _TYPES_H 

    // types.h 

    #ifndef GLOBAL 
    # define GLOBAL extern 
    #endif 

    GLOBAL my_global mutex; 


#endif 
+0

Ok capisco cosa intendi. Fammi vedere come funziona. Grazie per il consiglio! – Alessandroempire

+0

Non penso che il gioco con 'GLOBAL' serva molto, qui. Hai bisogno di una dichiarazione nel file '.h' e una definizione * con inizializzazione * in' .c'. L'inizializzazione predefinita per 'pthread_mutex_t' non funzionerebbe. –

+0

@JensGustedt questo è esattamente quello che ho appena fatto e ha funzionato. Non ho notato che stavo inizializzando il mutex nel file .h. Tremendo sbaglio. – Alessandroempire

2

Ma sono abbastanza sicuro che non posso definire il mutex nel file son.c perché ogni volta che creo quel filo, il mutex verrà inizializzato per l'impostazione predefinita, non avermi permesso di usare in modo corretto . Non sono sicuro di questo.

Questo non è corretto. Inserisci la definizione mutex in quel file, ma al di fuori della funzione thread. Sarà inizializzato all'avvio del programma, ma non su ogni nuovo thread. È possibile inserire extern pthread_mutex_t mutex1; in uno dei file di intestazione in modo che tutti gli utenti del mutex che non sono in son.c siano a conoscenza del mutex.

+0

Questo era il mio dubbio! Ho pensato ogni volta che ho creato un nuovo thread, sarebbe solo resettato il mutex Bene, questa è una buona notizia. Molte grazie! – Alessandroempire