2012-05-21 11 views
5

Kiedy wątki są dodawane do boost :: thread_group jak:Jak usunąć obiekt wątku dynamicznego po zakończeniu samego wątku?

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

wszystkie tworzone obiekty boost :: thread są usuwane tylko wtedy, gdy my_threads obiekt jest poza zakresem. Ale mój główny wątek programu spawnuje wiele wątków podczas wykonywania. Jeśli więc około 50 wątków jest już wykonanych, około 1,5 Gb pamięci jest używane przez program, a pamięć ta jest zwalniana tylko podczas głównego zakończenia procesu.

Pytanie brzmi: Jak usunąć te dopalacze :: obiekt wątku po zakończeniu funkcji wątku?!

+1

Uważam, że to pytanie jest podobne: http://stackoverflow.com/questions/3970818/whats-the-best-way-to-delete-boostthread-object-right-after-its-work-is-compl – Naveen

+0

@Naveen, naprawdę potrzebuję otoki, która może przerwać wszystkie wątki z wątkami podrzędnymi, gdy wątek główny go o to poprosi. W pytaniu, które łączysz, polecam po prostu utworzyć wątek i odłączyć obiekt boost :: thread od niego. –

Odpowiedz

6

Można zrobić czegoś takiego, ale synchronizacji umysłu (lepiej jest użyć udostępnionego wskaźnik boost :: thread_group zamiast odniesienia, chyba że jesteś pewien, że grupa gwint będzie żył wystarczająco długo):

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 
} 

Można również sprawdzić funkcję at_thread_exit().

W każdym razie, obiekty boost :: thread nie powinny ważyć 30 MB.

+0

dzięki za rozwiązanie. Czekając na odpowiedź, pomyślałem również o wysłaniu wskaźnika boost :: thread do funkcji thread. –

+0

Używam ** htop ** na 2 ** Gentoo ** i 1 ** FreeBSD **. Na maszynach Gentoo kolumna ** VIRT ** na hopcie pokazuje ~ 450 MB, gdy zostało stworzonych i uruchomionych 15 wątków. W FreeBSD z taką samą liczbą wątków kolumna VIRT pokazuje ~ 65300KB. Jestem zdezorientowany –

+0

Zrozumiałem, że patrzyłem na niewłaściwą kolumnę. ** RES ** pokazuje około ** 33mb ** na wszystkich komputerach. Btw, nazywasz 'thg.remove_thread (thisThr)' w wątku bez użycia muteksa. Czy to bezpieczne ?! –

Powiązane problemy