2012-07-09 16 views
8

En las notas de la versión de la versión 1.50.0 de las bibliotecas Boost me observaron dos cambios de rotura (see here):cambios de ruptura en Boost.Thread 3.0.0

# 6266 cambio importante: destructor hilo debe llamar por terminado si se puede unir

# 6269 Cambio de interrupción: la asignación de movimiento de hilo debe llamar a terminar si se puede unir.

¿Qué significa esto para mis proyectos existentes que actualmente usan Boost 1.49.0? ¿Tengo que cambiar algo? Si es así, ¿qué tengo que cambiar exactamente? ¿Y qué ocurre si olvido modificar uno de mis proyectos existentes? ¿Recibiré errores de tiempo de compilación (espero que sí) o tendré problemas de tiempo de ejecución desagradables y difíciles de encontrar (absolutamente no lo creo)?

Respuesta

7

Cuando dice "Rompiendo el cambio", significa, "Su programa se rompe si depende del comportamiento que anteriormente era X, pero ahora es Y".

Para los dados dos cambios, significa que si se basan en el destructor o mover la asignación llamando join() (o detach()), que creo que era el comportamiento anterior, su programa debe ahora explícitamente join() o detach() o cumplir con su amigo std::terminate() . No es un error en tiempo de compilación, pero tampoco es un comportamiento de tiempo de ejecución impredecible. Obtendrá un accidente limpio que lo llevará directamente al destructor boost::thread, que es la causa del problema.

+1

Nota que llama a poner fin si se puede unir, es decir, no terminará si el objeto del hilo no se unió previamente pero está separado. – PlasmaHH

+1

Sí, me olvidé de 'detach()'. – Puppy

7

el siguiente código utilizado para que funcione correctamente, pero con v3 el programa se aborta como t deja a su alcance, porque thread::~thread llamadas std::terminate, en lugar de silencio se separe de la rosca:

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

void f() 
{} 

int main() 
{ 
    { 
    boost::thread t(f); 
    } 
    std::cout << "exiting gracefully" << std::endl; 
} 
Cuestiones relacionadas