Importancia de la marca -pthread al compilar

143

En varios proyectos de subprocesos múltiples de C y C ++, he visto el -pthreadindicador aplicado tanto a la etapa de compilación como a la de enlace, mientras que otros no lo usan en absoluto y simplemente pasan -lpthreada la etapa de enlace.

¿Existe algún peligro de no compilar y vincular con la -pthreadbandera, es decir, qué hace -pthreadrealmente? Estoy principalmente interesado en las plataformas Linux.

leeeroy
fuente

Respuestas:

107

Tratar:

gcc -dumpspecs | grep pthread

y buscar cualquier cosa que empieza con %{pthread:.

En mi computadora, esto hace que los archivos se compilen -D_REENTRANTy se vinculen con ellos -lpthread. En otras plataformas, esto podría diferir. Úselo -pthreadpara la mayor portabilidad.

El uso _REENTRANT, en GNU libc, cambia la forma en que funcionan algunos encabezados de libc. Como ejemplo específico, errnollama a una función que devuelve una ubicación de subproceso local.

Chris Jester-Young
fuente
3
Puede que no sea solo un errnopreprocesamiento en general. No estoy seguro de cuán relevante es el artículo hpl.hp.com/techreports/2004/HPL-2004-209.pdf en la práctica para las optimizaciones de gcc, pero estoy seguro de que me impresionó la profundidad de la revisión allí.
Pascal Cuoq
2
No creo que el ejemplo de errno sea correcto. Incluso sin una bandera -pthread o _REENTRANT define, my errno.h (glibc 2.10.1) y gcc (4.4.1 en amd64) genera una llamada dinámica para el manejo de errno y no se vincula con la dirección del símbolo.
Andy Ross
1
@Pascal: Gracias por el enlace. Va un poco por encima de mi cabeza en este momento, pero parece que el punto central es que el enhebrado no solo puede "agregarse", sino que debe diseñarse como parte del modelo de memoria. Estoy completamente de acuerdo con eso.
Chris Jester-Young
2
@Andy: su versión de gcc se puede crear para proporcionar -D_REENTRANTo -pthreadautomáticamente. Ejecute su compilación con g++ -vy volcará una gran cantidad de resultados sobre a qué parámetros está pasando realmente el front-end del compilador cc1plusy ld.
Tom
3
Todavía hay una pregunta que no se responde aquí: ¿Existe algún peligro de no compilar y vincular con el indicador -pthread, es decir, qué hace realmente -pthread?
natenho
40

De man gcc:

-pthread Agrega soporte para subprocesos múltiples con la biblioteca pthreads. Esta opción establece marcas para el preprocesador y el vinculador.

Dmitry
fuente