2013-01-14 17 views
57

C'è qualche differenza traPTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init (& mutex, param)

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 

O

pthread_mutex_t lock; 
pthread_mutex_init (&lock, NULL); 

Perchè sono abbastanza sicuro se io uso solo il primo metodo?

NOTA: La mia domanda si riferisce principalmente a programmi molto piccoli dove al massimo quello che farò è connettere diversi client a un server e risolvere le loro richieste con thread di lavoro.

risposta

49

Con le versioni precedenti dello standard POSIX, il primo metodo con un inizializzatore può funzionare solo con variabili assegnate staticamente, non quando la variabile è una variabile auto definita in un corpo di funzione. Sebbene non abbia mai visto una piattaforma in cui ciò non sarebbe consentito, anche per le variabili auto e questa restrizione è stata rimossa nella versione più recente dello standard POSIX.

La variante static è davvero preferibile se possibile, dal momento che consente di scrivere codice di bootstrap molto più facile. Ogni volta che in fase di esecuzione si immette nel codice che utilizza tale mutex, si può essere certi che il mutex è inizializzato. Questa è una preziosa informazione nel contesto multi-threading.

Il metodo che utilizza una funzione di inizializzazione è preferibile quando sono necessarie proprietà speciali per il mutex, ad esempio ricorsive per esempio o condivisibili tra processi, non solo tra thread.

6

È possibile impostare più attributi del mutex con l'inizializzazione dinamica, in più è possibile utilizzare il metodo dinamico solo se si aggiungono una serie di mutex in fase di esecuzione.

Non c'è niente di sbagliato nell'approccio statico, se questo soddisfa le tue esigenze.

+0

"_plus è possibile utilizzare il metodo dinamico solo se si aggiungono una serie di mutex in fase di esecuzione." "Che cosa significa? Un piccolo esempio se non è facile da spiegare? – Kalec

+1

@Kalec: se il mutex è allocato da 'malloc()' (o appartiene a un oggetto che è allocato). –

+2

@Kalec se la variabile mutex "lock" fa parte di una struttura, quindi non possiamo seguire il primo approccio. dobbiamo usare pthread_init(). –

2

Nei casi in cui gli attributi mutex di default sono appropriati, la macro PTHREAD_MUTEX_INITIALIZER può essere utilizzata per inizializzare i mutex.

Se si desidera specificare gli attributi per mutex andare con l'inizializzazione dinamica ........

L'effetto è equivalente alla inizializzazione dinamica da una chiamata a pthread_mutex_init() con il parametro attrspecified come NULL, ad eccezione che non vengono eseguiti controlli di errore.