Bedeutung des Flag -pthread beim Kompilieren

143

In verschiedenen Multithread-C- und C ++ - Projekten habe ich gesehen, dass das -pthreadFlag sowohl auf die Kompilierungs- als auch auf die Verknüpfungsphase angewendet wurde, während andere es überhaupt nicht verwenden und einfach -lpthreadauf die Verknüpfungsphase übergehen .

Besteht die Gefahr, nicht mit der -pthreadFlagge zu kompilieren und zu verknüpfen - dh was macht das -pthreadeigentlich? Ich interessiere mich hauptsächlich für Linux-Plattformen.

Leeeroy
quelle

Antworten:

107

Versuchen:

gcc -dumpspecs | grep pthread

und suchen Sie nach allem, was mit beginnt %{pthread:.

Auf meinem Computer werden dadurch Dateien kompiliert -D_REENTRANTund verknüpft -lpthread. Auf anderen Plattformen kann dies abweichen. Verwenden Sie -pthreadfür die meiste Portabilität.

Durch die Verwendung _REENTRANTvon GNU libc wird die Funktionsweise einiger libc-Header geändert. Als spezielles Beispiel wird errnoeine Funktion aufgerufen, die einen threadlokalen Speicherort zurückgibt.

Chris Jester-Young
quelle
3
Es kann nicht nur eine errnoVorverarbeitung im Allgemeinen sein. Ich bin mir nicht sicher, wie relevant der Artikel hpl.hp.com/techreports/2004/HPL-2004-209.pdf für gcc-Optimierungen in der Praxis ist, aber ich war wirklich beeindruckt von der Tiefe der Überprüfung dort.
Pascal Cuoq
2
Ich denke nicht, dass das errno Beispiel richtig ist. Auch ohne -pthread-Flag oder _REENTRANT-Definition erzeugen meine errno.h (glibc 2.10.1) und gcc (4.4.1 auf amd64) einen dynamischen Aufruf für die Fehlerbehandlung und verknüpfen nicht mit der Symboladresse.
Andy Ross
1
@Pascal: Danke für den Link. Es geht im Moment etwas über meinen Kopf hinaus, aber es scheint, dass der zentrale Punkt darin besteht, dass Threading nicht nur "angeheftet" werden kann, sondern stattdessen als Teil des Speichermodells entworfen werden muss. Dem stimme ich voll und ganz zu.
Chris Jester-Young
2
@Andy - Ihre Version von gcc kann für die Bereitstellung -D_REENTRANToder -pthreadautomatisch erstellt werden. Führen Sie Ihren Build mit aus, g++ -vund es wird eine Menge Ausgabe darüber ausgegeben, welche Parameter das Compiler-Frontend tatsächlich an cc1plusund übergibt ld.
Tom
3
Hier wird noch eine Frage nicht beantwortet: Besteht die Gefahr, dass das Flag -pthread nicht kompiliert und mit ihm verknüpft wird - dh was macht -pthread tatsächlich?
Natenho
40

Von man gcc:

-pthread Fügt Unterstützung für Multithreading mit der pthreads-Bibliothek hinzu. Diese Option setzt Flags sowohl für den Präprozessor als auch für den Linker.

Dmitry
quelle