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.

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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.