2012-05-21 12 views
5

Cuando se añaden hilos para impulsar :: thread_group como:Cómo eliminar el objeto de subproceso de subproceso cuando termina el subproceso?

boost::thread_group my_threads; 
boost::thread *t = new boost::thread(&someFunc); 
my_threads.add_thread(th); 

todos los objetos impulso :: hilo creadas se eliminan sólo cuando my_threads objeto está fuera de alcance. Pero el hilo principal de mi programa genera muchos hilos durante la ejecución. Entonces, si ya se han realizado alrededor de 50 subprocesos, el programa usa aproximadamente 1,5Gb de memoria y esta memoria se libera solo en la terminación del proceso principal.

La pregunta es: ¿Cómo eliminar estos objetos boost :: thread cuando la función de hilo ha finalizado?

+1

Creo que esta pregunta es similar: http://stackoverflow.com/questions/3970818/whats-the-best-way-to-delete-boostthread-object-right-after-its-work-is-compl – Naveen

+0

@Naveen, realmente necesito una envoltura que pueda interrumpir todos los hilos de los hijos agrupados cuando lo solicite el hilo principal. En caso de que vincules, recomiendan simplemente crear un hilo y separar el objeto boost :: thread de él. –

Respuesta

6

Se podría hacer algo como esto, pero la sincronización de la mente (que es mejor usar el puntero compartida para impulsar :: thread_group lugar de referencia, a menos que esté seguro de que grupo de hilos vivirá lo suficiente):

void someFunc(..., boost::thread_group & thg, boost::thread * thisTh) 
{ 
    // do sth 

    thg.remove_thread(thisThr); 
    delete thisTh; // we coud do this as thread of execution and boost::thread object are quite independent 
} 

void run() 
{ 
    boost::thread_group my_threads; 
    boost::thread *t = new boost::thread(); // invalid handle, but we need some memory placeholder, so we could pass it to someFunc 
    *t = boot::thread(
    boost::bind(&someFunc, boost::ref(my_threads), t) 
); 
    my_threads.add_thread(t); 
    // do not call join 
} 

También podría verificar la función at_thread_exit().

De todos modos, impulsar :: objetos de hilo no debe pesar 30 MB.

+0

gracias por la solución. Mientras esperaba la respuesta, también pensó en enviar el puntero boost :: thread a la función thread. –

+0

Estoy usando ** htop ** en 2 máquinas ** Gentoo ** y 1 ** FreeBSD **. En máquinas Gentoo, la columna ** VIRT ** de htop muestra ~ 450MB cuando hay 15 subprocesos creados y en ejecución. En FreeBSD con el mismo número de hilos, la columna VIRT muestra ~ 65300KB. Estoy confundido –

+0

Me di cuenta de que estaba mirando la columna equivocada. ** RES ** muestra aproximadamente ** 33mb ** en todas las máquinas. Por cierto, llamas 'thg.remove_thread (thisThr)' en el hilo sin usar un mutex. ¡¿Es seguro?! –

Cuestiones relacionadas