2012-05-21 2 views
5

Wenn Threads steigern werden zu :: thread_group wie:Wie lösche ich das Boost-Thread-Objekt, wenn der Thread selbst beendet wird?

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

alle erstellten boost :: Thread-Objekte nur gelöscht werden, wenn my_threads Objekt außerhalb des Bereichs ist. Aber mein Programm-Haupt-Thread erzeugt während der Ausführung viele Threads. Wenn also ungefähr 50 Threads bereits erledigt sind, wird ungefähr 1,5Gb des Speichers vom Programm verwendet und dieser Speicher wird nur beim Hauptprozessbeendigung freigegeben.

Die Frage ist: Wie Sie diese boost :: Thread-Objekt löschen, wenn die Thread-Funktion beendet ist?!

+1

Ich glaube, diese Frage ist ähnlich: http://stackoverflow.com/questions/3970818/whats-the-best-way-to-delete-boostthread-object-right-after-its-work-is-compl – Naveen

+0

@ Naveen, ich brauche wirklich einen Wrapper, der alle gepoolten Kinder-Threads unterbrechen kann, wenn der Haupt-Thread danach fragt. In der Frage, die du verlinkt hast, empfehlen sie, nur einen Thread zu erstellen und das boost :: thread-Objekt davon zu lösen. –

Antwort

6

Sie etw wie dies tun könnte, aber Geist Synchronisation (es ist besser, geteilt Zeiger zu verwenden, anstatt des Verweises auf boost :: thread_group, wenn Sie sicher sind, dass Thread-Gruppe lange genug leben):

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 
} 

Sie könnten auch at_thread_exit() -Funktion überprüfen.

Wie auch immer, sollte boost :: Thread-Objekte nicht 30 MB Gewicht.

+0

danke für die Lösung. Während auf die Antwort gewartet wurde, dachte auch daran, den boost :: thread Zeiger an die Thread Funktion zu senden. –

+0

Ich benutze ** HTOP ** auf 2 ** Gentoo ** Maschinen und 1 ** FreeBSD **. Auf Gentoo Maschinen zeigt die ** VIRT ** Spalte von htop ~ 450MB, wenn 15 Threads erstellt und ausgeführt werden. Unter FreeBSD mit derselben Anzahl von Threads zeigt die VIRT-Spalte ~ 65300KB. Ich bin verwirrt –

+0

Ich erkannte, dass die falsche Spalte sah. ** RES ** zeigt an allen Maschinen ca. ** 33mb ** an. Btw, du nennst 'thg.remove_thread (thisThr)' im Thread, ohne einen Mutex zu benutzen. Ist es sicher?! –