2012-09-21 30 views
42

Una macro preprocesador llamada _GLIBCXX_USE_NANOSLEEP aparece en dos archivos de cabecera estándar:¿De qué se trata _GLIBCXX_USE_NANOSLEEP?

  • C++/4.7.1/x86_64-unknown-linux-gnu/bits/C++ config.h
  • C++/4.7.1/hilo

En una versión por defecto de GCC 4.7.1 (Linux, 64 bits) lo único C++ config.hy incluye este comentario es:

/* Defined if nanosleep is available. */ 
/* #undef _GLIBCXX_USE_NANOSLEEP */ 

Mientras que en hilo, la definición de std::this_thread::sleep_for() y std::this_thread::sleep_until() dependen de la macro por definir. Si no está definido, tampoco se definirán las dos funciones – aunque sean requeridas por el Estándar C++ –.

En mi sistema (glibc 2.15), la macro no está definida, aunque la función nanosleep() (declarada en ctime) existe y está operativa.

Me gustaría saber de qué se trata y cómo solucionarlo. Específicamente:

  • ¿Hay una opción de configuración que se debe utilizar en la construcción de GCC para activar esta macro por defecto, según lo sugerido por this post? (No pude encontrar ninguno en el online documentation of the build process.)
  • ¿Existe realmente una relación entre la función nanosleep() y la macro? La declaración de nanosleep() en ctime/time.h no parece depender de, o definir, la macro.
  • ¿Hay algún riesgo específico involucrado en la definición de la macro en mis propios archivos de encabezado, o como una opción -D en la línea de comandos (como se sugiere en this related question)? ¿Qué sucede si hago esto en un sistema donde nanosleep() no está disponible, y cómo puedo averiguarlo?

actualización De GCC 4.8 en adelante, el apoyo a std::this_thread::sleep_for() y similares se incluye automáticamente en libstdC++. No se requiere ninguna bandera de configuración. De the GCC 4.8 change log:

this_thread :: sleep_for(), this_thread :: sleep_until() y this_thread :: rendimiento() se definen sin requerir la opción de configuración-libstdcxx tiempo --enable;

Pero tenga en cuenta los detalles sobre esto para GCC 4.8 y 4.9 dados en la respuesta de Jonathan.

+0

¿Lo compiló usted mismo, o es un C++ proporcionado por el desarrollador? – nneonneo

+0

@nneonneo Lo construí siguiendo las [descripciones de compilación] (http://gcc.gnu.org/install/), sin usar opciones especiales, excepto directorios específicos del usuario. – jogojapan

+1

En cualquier punto, ¿'configure' chequea' nanosleep'? ¿Qué decía? – nneonneo

Respuesta

68

Cuando libstdC++ se construye su guión configure pone a prueba su sistema para ver qué funciones son compatibles, y en base a los resultados que define (o undefines) varias macros en c++config.h

En su caso configure determinado que la función POSIX nanosleep() no está disponible y la macro no está definida. Sin embargo, como dices, nanosleep()está disponible en tu sistema.La razón por la que no está habilitado por configure es que los controles para que ni siquiera funcionan a menos que utilice la opción --enable-libstdcxx-time (documentado en el Configuration chapter of the libstdc++ manual, no el docs GCC Configurar)

  • ¿Hay una opción de configuración que debería usarse al crear GCC para activar esta macro de forma predeterminada, como lo sugiere esta publicación? (No he podido encontrar ninguna en la documentación en línea del proceso de construcción.)

Sí, --enable-libstdcxx-time

  • ¿existe realmente una relación entre la función nanosleep() y la macro? La declaración de nanosleep() en ctime/time.h no parece depender de, o definir, la macro.

La declaración de la función de glibc no depende de libstdC++ 's macro, no. Pero la macro le dice a libstdC++ si debe usar la función o no.

  • ¿Hay algún riesgo específico involucrado en la definición de la macro en mis propios archivos de cabecera, o como una opción -D en la línea de comandos (como se sugiere en esta pregunta relacionada)? ¿Qué pasa si hago esto en un sistema donde nanosleep() no está disponible, y cómo puedo averiguarlo?

Es travieso y no es compatible, pero funcionará. La macro es un detalle de implementación interna que debería ser configurada por la configuración y no por los usuarios, y cambiar la definición de las macros internas de la implementación puede romper las cosas. Pero en este caso no lo hará porque el único código que depende de él está en un encabezado, ningún código de biblioteca en libstdc++.so se ve afectado.

Pero sería mejor volver a instalar GCC y utilice la opción --enable-libstdcxx-time, o si eso no es posible editar su c++config.h para definir la macro a la verdadera.

Si se define en un sistema diferente, donde no está disponible nanosleep() obtendrá un error de compilación cuando #include <thread>.

Tengo un ideas para mejorar esa configuración, por lo que nanosleep() y sched_yield() se verificarán de manera predeterminada, pero aún no he tenido tiempo de trabajar en ellos.

Actualización: He cometido algunos cambios para que la construcción de GCC 4.8 sin --enable-libstdcxx-time todavía definir std::this_thread::yield() (como un no-op) e implementará std::this_thread::sleep_for()std::this_thread::sleep_until() y utilizando la resolución más baja ::sleep() y ::usleep() funciones en lugar de ::nanosleep(). Sin embargo, es mejor definir --enable-libstdcxx-time.

Otra actualización: GCC 4.9.0 está fuera y ahora por defecto para permitir automáticamente nanosleep y sched_yield en las plataformas que se sabe que apoyarlos.Ya no es necesario usar --enable-libstdcxx-time.

+3

** Esta es una gran respuesta y merece muchos votos favorables. ** (Estoy reconstruyendo ahora con la opción de ortografía correcta e informaré una vez que haya terminado, pero en cualquier caso, esto explica el fondo que me interesaba) – jogojapan

+0

Sólo para confirmar: después de corregir la ortografía de la opción, funcionó. Gracias de nuevo. – jogojapan

Cuestiones relacionadas