c++ multithreading boost boost-thread

c++ - ¿Cuál es la mejor manera de eliminar el objeto boost:: thread justo después de que se complete su trabajo?



multithreading boost-thread (4)

Deberías echarle un vistazo a la interrupción de hilo .

Este artículo es bueno también

http://www.boost.org/doc/libs/1_38_0/doc/html/thread/thread_management.html

Creo el objeto boost::thread con un new operador y continúo sin esperar que este hilo termine su trabajo:

void do_work() { // perform some i/o work } boost::thread *thread = new boost::thread(&do_work);

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


La duración del objeto boost::thread y la duración del thread nativo no están relacionados. El objeto boost::thread puede salir del alcance en cualquier momento.

Del boost::thread documentación de la clase boost::thread

Así como la vida útil de un archivo puede ser diferente de la vida útil de un objeto iostream que representa el archivo, la duración de un hilo de ejecución puede ser diferente del objeto de hilo que representa el hilo de ejecución. En particular, después de una llamada a join (), el hilo de ejecución ya no existirá aunque el objeto de hilo continúe 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 solo necesita iniciar un hilo y nunca invocar join , puede usar el constructor del hilo como una función:

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

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


Puedes usar

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

Una 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 boost::thread destructor también llama a detach() si el objeto posee un hilo en ejecución, por lo que dejar que se destruya tendrá el mismo resultado.


Sugiero que use boost :: shared_ptr, por lo que no se tendrá cuidado cuando se elimine el objeto thread.

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