linux - pthread_create - ¿Necesito-D_REENTRANT con-pthreads?
pthread c (3)
En Linux (kernel 2.6.5) nuestro sistema de compilación llama a gcc con -D_REENTRANT
.
¿Todavía se requiere esto al usar pthreads
?
¿Cómo se relaciona con la opción gcc -pthread
? Entiendo que debería usar -pthread
con pthreads, ¿aún necesito -D_REENTRANT
?
En una nota lateral, ¿hay alguna diferencia que sepa entre el uso de REENTRANT entre gcc 3.3.3 y gcc 4.xx?
Cuando uso la opción -pthread
gcc, puedo ver que _REENTRANT
se define. -D_REENTRANT
desde la línea de comandos puede hacer alguna diferencia, por ejemplo, ¿podrían compilarse algunos objetos sin soporte de subprocesos múltiples y luego vincularse en binario que utiliza pthreads y causará problemas?
Supongo que debería estar bien solo 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 compilando múltiples bibliotecas estáticas y aplicaciones que se vinculan con las bibliotecas estáticas, tanto las bibliotecas como las aplicaciones usan pthreads.
Creo que fue 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?
Desde las páginas de información de gcc:
`-pthread''
Adds support for multithreading with the "pthreads" library. This
option sets flags for both the preprocessor and linker.
Así que solo la bandera de subprocesos debería ser suficiente. Sin embargo, no recomendaría solo pasarlo a algunos de tus códigos.
Como Chris sugirió en los comentarios, el uso de gcc -dumpspecs en Linux confirma que también establece indicadores de preprocesador:
%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}
Para mí, la mejor respuesta fue el comentario de pts
si solo se molestaba en enviarlo como respuesta:
Usted investigó adecuadamente y respondió su propia pregunta. Use
g++ -pthread
, es equivalente ag++ -lpthread -D_REENTRANT
. Usarg++ -D_REENTRANT
sería diferente, es posible que no configure todas las banderas del enlazador. - pts 18 de mayo a las 0:30
gcc''s -pthreads flag establece los indicadores relevantes del compilador y del enlazador necesarios para el soporte de pthreads en la plataforma en la que se encuentra.
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.
(Por lo menos durante un tiempo, en aix, -pthread provocó que g ++ se vincule en una libstdc ++. A completamente diferente. No sé si ese sigue siendo el caso ahora, aunque ...)