Signification de l'indicateur -pthread lors de la compilation

143

Dans divers projets multi threadés C et C ++, j'ai vu l' -pthreadindicateur appliqué à la fois à l'étape de compilation et de liaison, tandis que d'autres ne l'utilisent pas du tout et passent simplement -lpthreadà l'étape de liaison.

Y a-t-il un danger à ne pas compiler et à lier avec le -pthreaddrapeau - c'est-à-dire que fait-il -pthreadréellement? Je m'intéresse principalement aux plates-formes Linux.

Leeeroy
la source

Réponses:

107

Essayer:

gcc -dumpspecs | grep pthread

et recherchez tout ce qui commence par %{pthread:.

Sur mon ordinateur, cela entraîne la compilation -D_REENTRANTet la liaison des fichiers avec -lpthread. Sur d'autres plates-formes, cela peut différer. Utilisez -pthreadpour la plupart de la portabilité.

Utiliser _REENTRANT, sur GNU libc, change le fonctionnement de certains en-têtes de libc. À titre d'exemple spécifique, il errnoappelle une fonction renvoyant un emplacement local au thread.

Chris Jester-Young
la source
3
Ce n'est peut-être pas seulement le errnoprétraitement en général. Je ne suis pas sûr de la pertinence de l'article hpl.hp.com/techreports/2004/HPL-2004-209.pdf dans la pratique pour les optimisations gcc, mais j'ai certainement été impressionné par la profondeur de l'examen.
Pascal Cuoq
2
Je ne pense pas que l'exemple d'errno soit correct. Même sans un indicateur -pthread ou une définition _REENTRANT, mes errno.h (glibc 2.10.1) et gcc (4.4.1 sur amd64) génèrent un appel dynamique pour la gestion d'errno et ne sont pas liés à l'adresse du symbole.
Andy Ross
1
@Pascal: Merci pour le lien. Cela va un peu au-dessus de ma tête pour le moment, mais il semble que le point central est que le filetage ne peut pas simplement être «cloué», mais doit plutôt être conçu dans le cadre du modèle de mémoire. Je suis entièrement d'accord avec cela.
Chris Jester-Young
2
@Andy - votre version de gcc peut être construite pour fournir -D_REENTRANTou -pthreadautomatiquement. Exécutez votre build avec g++ -vet il videra beaucoup de sortie sur les paramètres que le front-end du compilateur passe réellement à cc1pluset ld.
Tom
3
Il y a toujours une question sans réponse ici: y a-t-il un danger de ne pas compiler et de ne pas lier avec l'indicateur -pthread - c'est-à-dire que fait réellement -pthread?
natenho le
40

De man gcc:

-pthread Ajoute la prise en charge du multithreading avec la bibliothèque pthreads. Cette option définit des indicateurs pour le préprocesseur et l'éditeur de liens.

Dmitry
la source