2011-07-09 21 views
6

Quiero que un hilo de refuerzo duerma durante algunos nanosegundos. El siguiente código es una muestra que se compila sin errores. Sin embargo, no funciona como se esperaba y no puedo entender por qué.Dormir un hilo de refuerzo durante algunos nanosegundos

#include <iostream> 
#include <boost/thread.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time.hpp> 
//Building options: 
//-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG -lboost_date_time-mt -lboost_thread-mt 
void replay() 
{ 
    boost::posix_time::time_duration time1, time2; 

    time1=boost::posix_time::seconds(3); 
    std::cout << boost::posix_time::to_simple_string(time1) << std::endl; 
    boost::this_thread::sleep(time1); 

    time2=boost::posix_time::nanoseconds(987654321); 
    std::cout << boost::posix_time::to_simple_string(time2) << std::endl; 
    boost::this_thread::sleep(time2); 
} 
int main(int argc, char* argv[]) 
{ 
    boost::thread replaythread(replay); 
    replaythread.join(); 
    return 0; 
} 

El BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG es una definición de preprocesador necesario para trabajar con nanosegundos (more info). Los problemas se producen cuando configuro la opción de compilación -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG, y luego boost :: this_thread :: sleep no funciona para ningún posix :: time_duration. El hilo creado usa toda la CPU y no duerme ni procesa las instrucciones restantes. Si se elimina la definición del preprocesador, el hilo puede dormir durante cualquier período de tiempo a menos que refuerce :: posix_time :: nanoseconds. El programa usa algunas variables time_duration para almacenar nanosegundos y eso hace que el boost :: this_thread :: sleep no funcione.

Muchas gracias por su tiempo

+1

¿Qué quiere decir con que no funciona? ¿Duerme a corto o largo o no? ¿Cuál es el resultado de la línea std :: cout con los nanosecs? – Nobody

+0

Tienes razón. Edité la publicación con una mejor descripción. Gracias. – Emer

+0

¿Intentó vincular el programa con debuginformation para mejorar y observar lo que sucede mientras duerme? Para mí, suena como una espera ocupada, lo cual es claro ya que no hay otra posibilidad de dormir durante nanosegundos porque está muy por debajo de los límites del planificador. Quizás el bucle que está esperando nunca vuelva por alguna razón. – Nobody

Respuesta

7

El BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG cambia el tamaño de ptime.

boost::this_thread::sleep es una función compilada, que se compiló (en su distribución) sin esa definición, por lo que espera argumentos de ptime de precisión de microsegundos. Está pasando argumentos ptime de precisión de nanosegundos, y la función falla.

Si extrae el código de la biblioteca de impulso y compilarlo con este Definir activada, el programa funciona como se esperaba:

#include <iostream> 
#include <boost/thread.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time.hpp> 

// the guts of boost_1_46_1/libs/pthread/thread.cpp's version of sleep() 
boost::mutex sleep_mutex; 
boost::condition_variable sleep_condition; 
void mysleep(const boost::posix_time::time_duration& dur) 
{ 
    boost::system_time st = boost::get_system_time() + dur; 
    boost::unique_lock<boost::mutex> lk(sleep_mutex); 
    while(sleep_condition.timed_wait(lk, st)); 
} 

void replay() 
{ 
    boost::posix_time::time_duration time1, time2; 

    time1=boost::posix_time::seconds(3); 
    std::cout << boost::posix_time::to_simple_string(time1) << std::endl; 
    mysleep(time1); 
    //boost::this_thread::sleep(time1); 

    time2=boost::posix_time::nanoseconds(987654321); 
    std::cout << boost::posix_time::to_simple_string(time2) << std::endl; 
    mysleep(time2); 
    //boost::this_thread::sleep(time2); 
} 
int main() 
{ 
    boost::thread replaythread(replay); 
    replaythread.join(); 
    return 0; 
} 
+1

(tenga en cuenta que este código es solo de demostración, ya que mi mutex y condvar son globales, mientras que en la biblioteca real son miembros no estáticos de la clase boost :: thread) – Cubbi

+0

Muchas gracias por su útil respuesta. Estoy intentando construir la biblioteca de hilos con esa definición usando 'b2'. Añadí la línea 'variant new_release: release: BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG;' al 'user-config.jam' sin éxito. ¿Sabes dónde incluir la opción de definir? – Emer

2

Algunas funciones del sueño regresan temprano cuando se veía interrumpida por lo que tiene que comprobar el valor de retorno de la función y llamar de nuevo hasta que vuelven a cero.

Cuestiones relacionadas