Significato del flag -pthread durante la compilazione


143

In vari progetti C e C ++ multi thread ho visto il -pthreadflag applicato sia allo stadio di compilazione che a quello di collegamento, mentre altri non lo usano affatto e passano -lpthreadallo stadio di collegamento.

Esiste un pericolo non compilare e collegare con la -pthreadbandiera - cioè che cosa fa -pthreadeffettivamente? Sono principalmente interessato alle piattaforme Linux.

Risposte:


107

Provare:

gcc -dumpspecs | grep pthread

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

Sul mio computer, ciò causa la compilazione -D_REENTRANTe il collegamento dei file -lpthread. Su altre piattaforme, questo potrebbe differire. Utilizzare -pthreadper la maggior portabilità.

L'uso di _REENTRANTGNU libc modifica il modo in cui funzionano alcune intestazioni di libc. Come esempio specifico, errnochiama una funzione che restituisce una posizione thread-local.


3
Potrebbe non essere solo errnoe pre-elaborazione in generale. Non sono sicuro di quanto l'articolo hpl.hp.com/techreports/2004/HPL-2004-209.pdf sia pertinente per le ottimizzazioni di gcc, ma sono rimasto colpito dalla profondità della recensione.
Pascal Cuoq,

2
Non credo che l'esempio errno sia corretto. Anche senza un flag -pthread o _REENTRANT, my errno.h (glibc 2.10.1) e gcc (4.4.1 su amd64) generano una chiamata dinamica per la gestione di errno e non si collegano all'indirizzo del simbolo.
Andy Ross,

1
@Pascal: grazie per il link. Va un po 'sopra la mia testa in questo momento, ma sembra che il punto centrale sia che il threading non può solo essere "attaccato", ma deve essere progettato come parte del modello di memoria. Sono completamente d'accordo.
Chris Jester-Young,

2
@Andy - la tua versione di gcc può essere costruita per fornire -D_REENTRANTo -pthreadautomaticamente. Esegui la tua build g++ -ve scaricherà molto output su quali parametri il front-end del compilatore sta effettivamente passando cc1pluse ld.
Tom,

3
C'è ancora una domanda a cui non è stata data una risposta qui: c'è qualche pericolo che non sia la compilazione e il collegamento con la bandiera -pthread - cioè cosa fa realmente -pthread?
natenho,

40

Da man gcc:

-pthread Aggiunge il supporto per il multithreading con la libreria pthreads. Questa opzione imposta flag sia per il preprocessore che per il linker.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.