c++ interrupt boost-thread

c++ - Boost Thread-Cómo reconocer la interrupción



interrupt boost-thread (1)

Para usar boost :: thread :: interrupt (), debe usar boost :: thread :: sleep () para que funcione.

Un hilo en ejecución puede interrumpirse invocando la función miembro interrupt () del objeto boost :: thread correspondiente. Cuando el hilo interrumpido ejecute a continuación uno de los puntos de interrupción especificados (o si está actualmente bloqueado mientras ejecuta uno) con la interrupción habilitada, se lanzará una excepción boost :: thread_interrupted en el hilo interrumpido. Si no se detecta, esto hará que la ejecución del subproceso interrumpido finalice. Al igual que con cualquier otra excepción, la pila se desenrollará y se ejecutarán los destructores para objetos de duración de almacenamiento automático.

Puntos de interrupción predefinidos:

Las siguientes funciones son puntos de interrupción, que lanzarán boost :: thread_interrupted si la interrupción está habilitada para el hilo actual, y se solicita la interrupción para el hilo 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()

Tengo una tarea de bloqueo que se realizará mediante la función find_the_question (). Sin embargo, no quiero que el hilo que ejecuta esta función tarde más de 10 segundos. Entonces, en caso de que demore más de 10 segundos, quiero cerrar ese hilo limpiando todos los recursos.

Intenté escribir un código para eso, pero de alguna manera no puedo obtener una interrupción en la función find_the_question () si el hilo tarda más de 10 segundos. ¿Podría por favor decirme 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 en completarse, obtendré la 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;

¿Podría por favor decirme qué estoy haciendo mal?

Gracias por adelantado