2009-05-18 16 views
39

En Linux (kernel 2.6.5) nuestro sistema de compilación llama a gcc con -D_REENTRANT.¿Necesito -D_REENTRANT con -pthreads?

¿Esto todavía se requiere al usar pthreads?

¿Cómo se relaciona con la opción gcc -pthread? Entiendo que debería usar -pthread con pthreads, ¿todavía necesito -D_REENTRANT?

En una nota al margen, ¿hay alguna diferencia que sepa entre el uso de REENTRANT entre gcc 3.3.3 y gcc 4.x.x?

Cuando uso -pthread opción gcc puedo ver que _REENTRANT se define. Omitir -D_REENTRANT desde la línea de comandos hace la diferencia, por ejemplo, ¿podrían compilarse algunos objetos sin soporte multiproceso y luego vincularse en binario que utiliza pthreads y causará problemas?

supongo que debe ser aceptable sólo para usar:g++ -pthread

> echo | g++   -E -dM -c - > singlethreaded 
> echo | g++ -pthread -E -dM -c - > multithreaded 
> diff singlethreaded multithreaded 
39a40 
> #define _REENTRANT 1 

Estamos compilar varias bibliotecas estáticas y aplicaciones que enlazan con las bibliotecas estáticas, ambas bibliotecas y pthreads de uso de aplicaciones.

Creo que era necesario en algún momento del pasado, pero quiero saber si todavía es necesario. Google no ha devuelto ninguna información reciente que mencione D_REENTRANT con pthreads. ¿Podría indicarme enlaces o referencias sobre el uso en la versión más reciente de kernel/gcc/pthread?

Aclaración: en este momento estamos usando -D_REENTRANT y -lpthread, supongo que puedo reemplazarlos con solo g ++ -pthread, mirando man gcc establece los indicadores tanto para el preprocesador como para el enlazador. ¿Alguna idea?

+16

Investiguaste correctamente y respondiste a tu propia pregunta. Use 'g ++ -pthread', es equivalente a' g ++ -pthread -D_REENTRANT'. El uso de 'g ++ -D_REENTRANT' sería diferente, no puede establecer todos los indicadores del enlazador. – pts

+0

Hm así que es 'g ++ -D_REENTRANT -lpthread' o' g ++ -pthread', ¿ambas formas tienen el mismo efecto? – stefanB

+6

Use -pthread, not -lpthread. La opción -pthread establece todos los indicadores necesarios para enhebrar, sin importar en qué plataforma estés. Usar -lpthread solo se vincularía en libpthread, lo que puede no ser suficiente para algunas plataformas. (Por ejemplo, OpenBSD solía no tener libpthread --- usó libc_r en su lugar.) –

Respuesta

17

Para mí la mejor respuesta fue el comentario de pts aunque sólo se molestaba para enviarlo como respuesta:

Se investigan adecuadamente y respondió su propia pregunta. Use g++ -pthread, es equivalente a g++ -lpthread -D_REENTRANT. Usar g++ -D_REENTRANT sería diferente, no puede configurar todas las banderas del enlazador. - pts 18 de mayo a las 0:30

+1

¿Debería ser "... es equivalente a g ++ -lpthread -D_REENTRANT"? es decir, el segundo -pthread debe ser -lpthread – BCran

+0

Correcto, probablemente error en el comentario original ... – stefanB

7

Desde las páginas de información sobre gcc:

`-pthread' 
    Adds support for multithreading with the "pthreads" library. This 
    option sets flags for both the preprocessor and linker. 

lo tanto, sólo la bandera -pthread debería ser suficiente. Sin embargo, no recomendaría solo pasarlo a algunos de tus códigos.

Como Chris sugirió en los comentarios, usando -dumpspecs gcc en Linux en efecto confirmar que se establece marcas preprocesador así: bandera -pthreads

%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT} 
5

de gcc establece los parámetros del compilador y enlazador pertinentes necesarios para el apoyo pthreads en la plataforma en la que estás.

Tienes razón, en Linux x86 (y probablemente en muchas otras plataformas), eso es equivalente a '-D_REENTRANT -lpthread', pero eso no es necesariamente cierto en todas las plataformas.

(Durante al menos un tiempo, en aix, -pthread provocó que g ++ se vincule en una libstdC++. A completamente diferente. No sé si todavía es así ahora, aunque ...)

+0

* "Durante al menos un tiempo, en aix, -pthread provocó que g ++ se vincule en una libstdC++. A" * - +1 completamente diferente, esto borró un bloqueo en AIX porque no estábamos usando '-pthread' o' -D_REENTRANT ', pero usamos' -lpthread'. – jww