2011-11-18 11 views
10

Mam program, który uruchamia pewne działania w osobnym therad, a następnie łączy się w wątku, takie jak ten:Valgrind donosi „ewentualnie utracone” pamięci podczas pracy z wątków Google Boost

#include <boost/thread.hpp> 
#include <iostream> 

using namespace std; 

void f() { 
    for (int i = 0; i < 100; ++i) cout << i << endl; 
} 

int main() { 
    boost::thread t(f); 
    t.join(); 
    return 0; 
} 

Jeśli uruchomić Valgrind na nim zgłasza "potencjalnie zagubioną" pamięć. Wydaje się to logiczne, jeśli pomijam join(), ponieważ w tym przypadku wątek nadal działa po wyjściu programu. Ale jeśli wątek zostanie zakończony, spodziewam się, że nie ma żadnych ostrzeżeń.

Oto backtrace:

==8797== 288 bytes in 1 blocks are possibly lost in loss record 2 of 3 
==8797== at 0x4A1F8B3: calloc (vg_replace_malloc.c:467) 
==8797== by 0x400F289: allocate_dtv (in /lib64/ld-2.4.so) 
==8797== by 0x400F34D: _dl_allocate_tls (in /lib64/ld-2.4.so) 
==8797== by 0x53EF981: [email protected]@GLIBC_2.2.5 (in /lib64/libpthread-2.4.so) 
==8797== by 0x4B3311D: boost::thread::start_thread() (in /home/egbomrt/BOOST/inst_1_47_0/lib/libboost_thread.so.1.47.0) 
==8797== by 0x40A20C: boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type) (thread.hpp:204) 
==8797== by 0x406295: main (main.cpp:12) 

Czy to problem z Boost, wątek, wątek Posix czy jest to całkowicie normalne? Mógłbym stworzyć dla niego regułę tłumienia, ale byłoby dobrze, gdybym dostał ostrzeżenie, jeśli jest niedokończony wątek, ale nie wtedy, gdy wszystkie wątki są zakończone.

+3

Możesz samodzielnie wyeliminować phtread (po prostu używając pthread_create/pthread_join bez doładowania) – sehe

+2

Nie można odtworzyć na GCC4.6.2/Boost 1.48. Jednak otrzymuję 8 bajtów w 1 bloku "wciąż osiągalnym". Nawiasem mówiąc, działa doskonale z '' zamiast wzmocnienia. –

+0

@sehe: Sądząc po stosie, nie ma to nic wspólnego z boostem. To pthread_create() przydziela struktury dla TLS. Zobacz http://www.akkadia.org/drepper/tls.pdf. –

Odpowiedz

4

Znalazłem problem z biblioteką pthread. Jeśli uruchomię program na SUSE 10, dostaję wycieki pamięci, ale jeśli uruchomię go w SUSE 11, nie otrzymam problemu.

Otrzymuję takie same wyniki zi bez zwiększenia.

Dzięki za komentarze. Pomogło mi to zlokalizować problem.