2012-05-21 14 views
5

Quando vengono aggiunti fili per amplificare :: thread_group come:Come eliminare l'oggetto boost boost quando termina il thread stesso?

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

tutti gli oggetti boost :: thread creato vengono eliminati solo quando my_threads oggetto è fuori portata. Ma il thread principale del mio programma genera molti thread durante l'esecuzione. Quindi, se sono già stati effettuati circa 50 thread, circa il 1,5 GB di memoria viene utilizzato dal programma e questa memoria viene liberata solo dalla terminazione del processo principale.

La domanda è: Come eliminare questi oggetto boost :: thread quando la funzione thread è terminata?!

+1

Credo che questa domanda sia simile: http://stackoverflow.com/questions/3970818/whats-the-best-way-to-delete-boostthread-object-right-after-its-work-is-compl – Naveen

+0

@Naveen, ho davvero bisogno di un wrapper in grado di interrompere tutti i thread figli in pool quando il thread principale lo richiede. Nella domanda che hai collegato loro raccomandano semplicemente di creare un thread e staccare l'oggetto boost :: thread da esso. –

risposta

6

Si potrebbe fare qc come questo, ma la sincronizzazione mente (è meglio usare il puntatore condiviso per aumentare :: thread_group invece di riferimento, a meno che non si è sicuri, che gruppo di thread vivrà abbastanza a lungo):

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 
} 

Si può anche verificare la funzione at_thread_exit().

In ogni caso, boost :: gli oggetti thread non devono pesare 30 MB.

+0

grazie per la soluzione. Mentre aspettava la risposta, pensavo anche di inviare il puntatore boost :: thread alla funzione thread. –

+0

Sto usando ** htop ** su 2 ** macchine Gentoo ** e 1 ** FreeBSD **. Sulle macchine Gentoo la colonna ** VIRT ** di htop mostra ~ 450 MB quando ci sono 15 thread creati e in esecuzione. Su FreeBSD con lo stesso numero di thread la colonna VIRT mostra ~ 65300KB. Sono confuso –

+0

Mi sono reso conto che stava guardando la colonna sbagliata. ** RES ** mostra circa ** 33mb ** su tutte le macchine. A proposito, tu chiami 'thg.remove_thread (thisThr)' nella discussione senza usare un mutex. È sicuro?! –

Problemi correlati