2011-05-18 14 views
7

¿Es necesario que agregue una macro _REENTRANT durante el tiempo de compilación para que mi subproceso errno sea seguro?¿Es necesario que agregue una macro _REENTRANT durante el tiempo de compilación para que mi subproceso errno sea seguro?

Si no, ¿es el caso para todas las versiones de gcc/linux/solaris o es necesario para ciertas versiones anteriores?

Recientemente probé una pieza de código donde _REENTRANT no se usó y encontré el comportamiento de error en una configuración indefinida en el entorno de múltiples hilos? Pero, después de agregar _REENTRANT todo estaba funcionando bien. El medio ambiente era Solaris.

Pero, la discusión here no parece indicar que sea obligatorio agregar _REENTRANT. Estoy un poco confundido.

Además, aparte de _REENTRANT, ¿debo agregar agregar otras opciones o libs para asegurar que mi aplicación tenga un hilo seguro errno?

Respuesta

10

En la práctica, _REENTRANT es un mensaje no deseado heredado de un momento en el que los hilos se consideraban una extensión pirateada además de las implementaciones existentes, y el comportamiento predeterminado de la biblioteca estándar no era seguro para subprocesos. No debería ser necesario en implementaciones modernas, y nunca fue estándar. (Tenga en cuenta que también es un nombre inapropiado, ya que reentrada y flujos seguros tienen significados radicalmente diferentes.)

En teoría, POSIX se requiere para consultar y utilizar las siguientes opciones de configuración a través de getconf si está compilando una programa de roscado:

  • POSIX_V7_THREADS_CFLAGS
  • POSIX_V7_THREADS_LDFLAGS

Por otro lado, gcc tiene su propia forma "portátil" conflictiva de solicitar soporte de subprocesos: la opción -pthread, que normalmente agrega las macros y bibliotecas predefinidas necesarias para que los subprocesos funcionen.

1

Normalmente necesita compilar con una opción como -mt-pthread-thread (esto es cierto para Sun CC y, para algunas plataformas, para gcc). Con esta opción, obtiene la definición que necesita. Si no lo usa, puede vincular la biblioteca incorrecta o incluso obtener un problema de generación de código (como la falta de protección para la inicialización de variables estáticas).

Cuestiones relacionadas