2011-09-06 13 views
15

He bloqueo tarea que se lleva a cabo por la función find_the_question(). Sin embargo, no quiero que el hilo que ejecuta esta función lleve más de 10 segundos. Entonces, en caso de que tome más de 10 segundos, quiero cerrar ese hilo con la limpieza de todos los recursos.Boost Tema - ¿Cómo reconocer interrumpo

traté de escribir un código para eso, pero por alguna razón no soy capaz de conseguir una interrupción en find_the_question función() si el hilo tarda más de 10 segundos. ¿Podría decirme por favor qué estoy haciendo mal?

void find_the_question(std::string value) 
{ 
    //allocate x resources 
    try{ 
     //do some process on resources 
      sleep(14); 
     //clean resources 
    } 
    catch(boost::thread_interrupted const&) 
    { 
     //clean resources 
     std::cout << "Worker thread interrupted" << std::endl; 
    } 
} 

int main() 
{ 
     boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(10000); 
     std::cout << "In main" << std::endl; 
     boost::thread t1(find_the_question, "Can you block me"); 

     t1.interrupt(); 
     if (t1.timed_join(timeout)) 
     { 
      //finished 
      std::cout << "Worker thread finished" << std::endl; 
     } 
     else 
     { 
      //Not finished; 
      std::cout << "Worker thread not finished" << std::endl; 
     } 

     std::cout << "In main end" << std::endl; 
} 

Salida: Si t1 tarda más de 10 segundos para completar, estoy consiguiendo siguiente salida de la consola.

std::cout << "In main" << std::endl; 
std::cout << "Worker thread not finished" << std::endl; 
std::cout << "In main end" << std::endl; 

mientras que, estoy esperando siguiente salida

std::cout << "In main" << std::endl; 
std::cout << "Worker thread interrupted" << std::endl; 
std::cout << "Worker thread not finished" << std::endl; 
std::cout << "In main end" << std::endl; 

¿Me podría decir qué estoy haciendo mal.

Gracias de antemano

+5

El 'sueño (14);' que está utilizando. ¿Esto es un sueño de 'boost :: thread' o es la función c sleep? Porque la interrupción solo funciona en 'boost :: thread: sleep' – mkaes

Respuesta

25

Para poder utilizar impulso :: hilo :: interrupción(), que tienen que impulsar el uso :: :: hilo del sueño() para que funcione.

Un hilo conductor se puede interrumpir mediante la invocación de la interrupción() miembro función del objeto impulso :: rosca correspondiente. Cuando el hilo interrumpido ejecuta a continuación uno de los puntos de interrupción especificada (o si se bloquea mientras se ejecutan actualmente uno) con interrupción habilitado, entonces un impulso :: thread_interrupted excepción será ser lanzado en el hilo interrumpido. Si no se detecta, esto causará que finalice la ejecución de la secuencia interrumpida. Como con cualquier otro excepción, la pila se desenrolla, y destructores para objetos de duración de almacenamiento automático se ejecutará

puntos de interrupción predefinidos:

Las siguientes funciones son puntos de interrupción, que se tirar impulso :: thread_interrupted si la interrupción está habilitada para la corriente hilo, y se solicita la interrupción para el subproceso actual:

boost::thread::join() 
boost::thread::timed_join() 
boost::condition_variable::wait() 
boost::condition_variable::timed_wait() 
boost::condition_variable_any::wait() 
boost::condition_variable_any::timed_wait() 
boost::thread::sleep() 
boost::this_thread::sleep() 
boost::this_thread::interruption_point()