2010-10-19 8 views
16

puedo crear boost::thread objeto con un operador new y continuar sin esperar este hilo para terminar su trabajo:¿Cuál es la mejor manera de eliminar impulso :: hilo objeto justo después de su trabajo está completo?

void do_work() 
{ 
    // perform some i/o work 
} 

boost::thread *thread = new boost::thread(&do_work); 

supongo, es necesario eliminar thread cuando el trabajo está hecho. ¿Cuál es la mejor manera de hacerlo sin esperar explícitamente a que termine el hilo?

+1

¿Por qué crear dinámicamente el hilo? –

+0

@ Martin York: Porque no quiero objeto hilo a ser destruido después de salir del ámbito de la variable. – itsvetkov

+2

Pero si lo deja caer fuera del alcance, entonces no puede acceder a él (y por lo tanto tiene fugas). El hecho de no tener acceso significa que no se puede hacer nada con él y el hilo de ejecución real sigue vivo de todos modos, por lo que parece inútil. Nota: Prácticamente ** NUNCA ** debes tener un puntero RAW así. –

Respuesta

19

curso de la vida del objeto boost::thread y la vida útil del hilo nativo no están relacionados. El objeto boost::thread puede salir del alcance en cualquier momento.

De la clase boost::threaddocumentation

Así como el tiempo de vida de un archivo puede ser diferente del tiempo de vida de un objeto iostream que representa el archivo, el tiempo de vida de un hilo de ejecución pueden ser diferentes de la rosca objeto que representa el hilo de ejecución. En particular, después de una llamada para unirse a(), ya no existirá el hilo de ejecución aunque el objeto hilo continúa existiendo hasta el final de su vida útil normal. Lo contrario también es posible; si un objeto de hilo se destruye sin que se haya llamado primero a join(), el hilo de ejecución continúa hasta que se completa su función inicial.

Editar: Si sólo tiene que iniciar un hilo y nunca invocar join, puede utilizar el constructor de la rosca como una función:

// Launch thread. 
boost::thread(&do_work); 

Sin embargo, yo no sugiero que haga que , incluso si crees que estás seguro de que el hilo se completará antes de que main() lo haga.

+1

Gracias. Soy nuevo en Boost Threads, por lo que el problema fue mi incomprensión de cómo funciona. – itsvetkov

+0

Hasta donde yo sé, así es como funcionan los hilos nativos en la mayoría de las plataformas de todos modos. Entonces, a menos que el destructor de subprocesos llame a join(), lo que sería un desastre en presencia de excepciones, es solo una consecuencia normal. –

13

Puede utilizar

boost::thread t(&do_work); 
t.detach(); 

vez que el hilo se separa ya no es propiedad del objeto boost::thread; el objeto puede ser destruido y el hilo continuará ejecutándose. El destructor boost::thread también llama a detach() si el objeto posee un hilo en ejecución, por lo que dejar t se destruirá tendrá el mismo resultado.

3

le sugiero que utilice impulso :: shared_ptr, para que no se tenga cuidado al eliminar objeto hilo.

boost::shared_ptr<boost::thread> thread(new boost::thread(&do_work)); 
+1

¿Cómo se elimina este objeto de subproceso cuando 'do_work' finaliza? –

Cuestiones relacionadas