boost :: this_thread :: interruption_point () no lanza boost :: thread_interrupted & exception

Quiero interrumpir un hilo usando boost :: thread interrupt (). Tengo el siguiente código que no lanza boost :: thread_interrupted & exception:

int myClass::myFunction (arg1, arg2) try{ //some code here do { boost::this_thread::interruption_point(); //some other code here } while (counter != 20000); }catch (boost::thread_interrupted&) { cout << "interrupted" << endl; } 

Si sustituyo boost :: this_thread :: interruption_point () con boost :: this_thread :: sleep (boost :: posix_time :: milisegundos (150)) la excepción es lanzar e interrumpir funciona como debería.

¿Alguien puede explicar por qué boost :: this_thread :: interruption_point () no lanza la excepción esperada?

Como señaló el comentarista, no hay manera de descartar una condición de carrera simple (depende mucho de su architecture y carga en la CPU). El hecho de agregar un sueño explícito “ayuda” subraya esto.

¿Está ejecutando en un sistema de un solo núcleo?

Aquí hay un simple ejemplo autocontenido en caso de que descubra algo que está haciendo de manera diferente. Ver este sencillo probador:

 #include  #include  struct myClass { int myFunction(int arg1, int arg2); }; int myClass::myFunction (int arg1, int arg2) { int counter = 0; try { //some code here do { boost::this_thread::interruption_point(); //some other code here ++counter; } while (counter != 20000); } catch (boost::thread_interrupted&) { std::cout << "interrupted" << std::endl; } return counter; } void treadf() { myClass x; std::cout << "Returned: " << x.myFunction(1,2) << "\n"; } int main() { boost::thread t(treadf); //t.interrupt(); // UNCOMMENT THIS LINE t.join(); } 

Se imprime

 Returned: 20000 

O bien, si descomenta la línea con t.interrupt()

 interrupted Returned: 0 

En mi sistema i7. Véalo en vivo en Coliru