c++ gcc sleep glibc

c++ - sleep milliseconds c



¿De qué se trata_GLIBCXX_USE_NANOSLEEP? (1)

Una macro de preprocesador llamada _GLIBCXX_USE_NANOSLEEP aparece en dos archivos de encabezado estándar:

  • c ++ / 4.7.1 / x86_64-unknown-linux-gnu / bits / c ++ config.h
  • c ++ / 4.7.1 / thread

En una compilación predeterminada de GCC 4.7.1 (Linux, 64 bits), lo único que C ++ config.h incluye es este comentario:

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

Mientras que en el hilo , la definición de std::this_thread::sleep_for() y std::this_thread::sleep_until() dependen de la macro que se va a definir. Si no está definido, ambas funciones -aunque así lo requiere el Estándar C ++- tampoco se definirán.

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 todo esto y cómo enfrentarlo. Específicamente:

  • ¿Hay alguna opción de configuración que se deba usar al crear GCC para activar esta macro de manera predeterminada, como lo sugiere esta publicación ? (No pude encontrar ninguno en la documentación en línea del proceso de compilación ).
  • ¿Existe realmente una relación entre la función nanosleep() y la macro? La declaración de nanosleep() en time.h / 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 esta pregunta relacionada )? ¿Qué pasa si hago esto en un sistema donde nanosleep() no está disponible, y cómo puedo averiguarlo?

Actualización de GCC 4.8 en adelante, soporte para std::this_thread::sleep_for() y similares se incluyen automáticamente en libstdc ++. No se requiere ninguna bandera de configuración. Del registro de cambios de GCC 4.8 :

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

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


Cuando se genera libstdc ++, su script configure prueba su sistema para ver qué características son compatibles y, en función de los resultados, define (o no define) varias macros en c++config.h

En su caso, configure determinó 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á habilitada por configure es que las comprobaciones ni siquiera se ejecutan a menos que utilice la opción --enable-libstdcxx-time (documentada en el capítulo Configuración del manual de libstdc ++ , no en los documentos de configuración de GCC)

  • ¿Hay alguna opción de configuración que se deba usar al crear GCC para activar esta macro de manera predeterminada, como lo sugiere esta publicación? (No pude encontrar ninguno en la documentación en línea del proceso de compilació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 la macro de libstdc ++, 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 encabezado, 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 malo 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, no hay código de biblioteca en libstdc++.so se ve afectado.

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

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

Tengo algunas ideas para mejorar esa configuración, así que nanosleep() y sched_yield() revisarán de manera predeterminada, pero aún no he tenido tiempo de trabajar en ellos.

Actualización: he realizado algunos cambios para que la --enable-libstdcxx-time GCC 4.8 sin --enable-libstdcxx-time siga definiendo std::this_thread::yield() (como no-op) e implemente std::this_thread::sleep_for() y std::this_thread::sleep_until() utilizando las funciones de resolución más baja ::sleep() y ::usleep() lugar de ::nanosleep() . Sin embargo, es mejor definir --enable-libstdcxx-time .

Otra actualización: GCC 4.9.0 está desactivado y ahora se nanosleep automáticamente para habilitar nanosleep y sched_yield en plataformas que se sabe que los admiten. Ya no es necesario utilizar --enable-libstdcxx-time .