¿Necesito REENTRAR-D con-pthreads?


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

¿Sigue siendo necesario cuando se utiliza pthreads?

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

En una nota al margen, hay alguna diferencia que usted sabe apagado entre el uso de REENTRANTE entre gcc 3.3.3 y gcc 4.x. x ?

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

Supongo que debería estar bien solo 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 en el pasado, pero quiero saber si todavía se requiere. Googlear no ha devuelto ninguna información reciente mencionando -D_REENTRANT con pthreads. ¿Podría indicarme enlaces o referencias que discuten el uso en la versión reciente de kernel/gcc/pthread ?

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

Author: jww, 2009-05-18

3 answers

Para mí la mejor respuesta fue el comentario de pts si solo se molestó en presentarlo como respuesta:

Usted investigó correctamente y respondió tu propia pregunta. Use g++ -pthread, es equivalente a g++ -lpthread -D_REENTRANT. Usar g++ -D_REENTRANT sería diferente, puede que no establezca todas las banderas del enlazador. – pts 18 de mayo a las 0:30

 17
Author: stefanB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-11 16:45:27

De las páginas de información del ccg:

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

Así que solo la bandera-pthread debería ser suficiente. Sin embargo, no recomendaría solo pasarlo a algunos de sus 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}
 7
Author: bdonlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-18 02:18:32

El indicador Gcc-pthreads 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.

(Durante al menos algún tiempo, en aix, -pthread causó que g++ se vinculara en un libstdc++completamente diferente.a. Aunque no se si ese sigue siendo el caso ahora...)

 5
Author: Stobor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-18 02:42:45