2010-01-24 1 views
116

In vari progetti C e C++ multi thread ho visto il flag -pthread applicato allo stage di compilazione e collegamento mentre altri non lo usano affatto e basta passare -lpthread allo stage di collegamento .Importanza del flag -pthread durante la compilazione

C'è qualche pericolo che non si compili e si colleghi al flag -pthread - cioè cosa fa effettivamente lo -pthread? Sono interessato principalmente alle piattaforme Linux.

risposta

94

Prova:

gcc -dumpspecs | grep pthread 

e potete trovare tutto ciò che inizia con %{pthread:.

Sul mio computer, questo fa sì che i file vengano compilati con -D_REENTRANT e collegati con -lpthread. Su altre piattaforme, questo potrebbe essere diverso. Utilizzare -pthread per la maggior parte della portabilità.

L'utilizzo di _REENTRANT, su GNU libc, cambia il funzionamento di alcune intestazioni di libc. Come esempio specifico, rende errno una funzione che restituisce una posizione locale del thread.

+3

Potrebbe non essere solo "errno" e la pre-elaborazione in generale. Non sono sicuro di quanto sia rilevante l'articolo http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf per le ottimizzazioni di gcc, ma sono stato sicuramente impressionato dalla profondità della recensione Là. –

+2

Non penso che l'esempio di errno sia corretto. Anche senza un flag -pthread o _REENTRANT define, my errno.h (glibc 2.10.1) e gcc (4.4.1 su amd64) genera una chiamata dinamica per la gestione di errno e non si collega con l'indirizzo del simbolo. –

+0

@Andy: Ho appena fatto un grep per '_REENTRANT' in'/usr/include'; Sono sicuro che ci sono altri esempi del suo utilizzo. –

31

Da man gcc:

-pthread Aggiunge il supporto per il multithreading con le pthreads biblioteca. Questa opzione imposta i flag sia per il preprocessore che per il linker.