2010-01-24 13 views
116

En varios proyectos C y C++ de múltiples hilos, he visto que el indicador -pthread se aplica a la etapa de compilación y enlace, mientras que otros no lo usan y simplemente pasan -lpthread a la etapa de vinculación .Importancia de -pthread Indicador al compilar

¿Existe algún peligro de no compilar y vincular con el indicador -pthread, es decir, qué hace realmente -pthread? Estoy interesado principalmente en plataformas Linux.

Respuesta

94

Probar:

gcc -dumpspecs | grep pthread 

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

En mi computadora, esto hace que los archivos se compilen con -D_REENTRANT y se vinculen con -lpthread. En otras plataformas, esto podría diferir. Use -pthread para la mayor portabilidad.

El uso de _REENTRANT, en GNU libc, cambia la forma en que funcionan algunos encabezados de libc. Como ejemplo específico, hace que errno llame a una función para devolver una ubicación local de subprocesos.

+3

Puede que no sea simplemente 'errno' y el preprocesamiento en general. No estoy seguro de cuán relevante es el artículo http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf para las optimizaciones de gcc, pero estoy impresionado por la profundidad de la revisión. ahí. –

+2

No creo que el ejemplo de errno sea correcto. Incluso sin un -pthread flag o _REENTRANT define, mi 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 enlaza con la dirección del símbolo. –

+0

@Andy: Acabo de hacer un grep para '_REENTRANT' en'/usr/include'; Estoy seguro de que hay otros ejemplos de su uso. –

31

De man gcc:

-pthread Añade soporte para múltiples hilos con los pthreads biblioteca. Esta opción establece indicadores tanto para el preprocesador como para el enlazador.