2010-01-24 6 views
116

In verschiedenen Multithread C und C++ - Projekten habe ich das -pthread Flag sowohl auf die Kompilierungs- und Verknüpfungsstufe angewendet, während andere es überhaupt nicht verwenden und einfach -lpthread an die Verknüpfungsstufe übergeben .Bedeutung von -pthread Flag beim Kompilieren

Besteht die Gefahr, dass das Flag -pthread nicht kompiliert und verknüpft wird - was macht -pthread eigentlich? Ich bin hauptsächlich an Linux-Plattformen interessiert.

Antwort

94

Versuchen:

gcc -dumpspecs | grep pthread 

und für etwas suchen, die mit %{pthread: beginnt.

Auf meinem Computer bewirkt dies, dass Dateien mit -D_REENTRANT kompiliert und mit -lpthread verknüpft werden. Auf anderen Plattformen könnte dies anders sein. Verwenden Sie -pthread für die meisten Portabilität.

Mit _REENTRANT, auf GNU libc, ändert sich die Art, wie einige libc Header funktionieren. Als ein spezifisches Beispiel ruft sie errno auf, um eine fadenlokale Position zurückzugeben.

+3

Es kann nicht nur "errno" und Vorverarbeitung im Allgemeinen sein. Ich bin nicht sicher, wie relevant der Artikel http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf in der Praxis für gcc-Optimierungen ist, aber ich war sicher beeindruckt von der Tiefe der Überprüfung Dort. –

+2

Ich denke nicht, dass das Fehler-Beispiel korrekt ist. Auch ohne ein -pthread-Flag oder _REENTRANT-define erzeugt mein errno.h (glibc 2.10.1) und gcc (4.4.1 auf amd64) einen dynamischen Aufruf zur errno-Behandlung und verbindet sich nicht mit der Symboladresse. –

+0

@Andy: Ich habe gerade ein Grep für '_REENTRANT' in'/usr/include'; Ich bin sicher, dass es andere Beispiele für seine Verwendung gibt. –

31

Von man gcc:

-pthread Fügt Unterstützung für Multithreading mit den pThreads Bibliothek. Diese Option setzt Flags für den Präprozessor und den Linker.