2011-11-18 9 views
10

Ho un programma che gira qualche azione in un therad separata, poi si unisce sul filo, come questo:Valgrind riporta memoria 'forse perduta' quando si lavora con le discussioni 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; 
} 

Se corro Valgrind su di esso, riporta la memoria "possibilmente persa". Questo sembra logico se ometto lo join(), perché in quel caso il thread è ancora in esecuzione quando il programma termina. Ma se il thread è finito, mi aspetterei che non ci siano avvertimenti.

Ecco il 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) 

È questo un problema con Boost Thread, Posix filo o si tratta di perfettamente normale? Potrei semplicemente creare una regola di soppressione per questo, ma sarebbe anche meglio se ricevessi un avviso se c'è un thread non finito, ma non quando tutti i thread sono finiti.

+3

è possibile eliminare phtread (semplicemente usando pthread_create/pthread_join senza boost) – sehe

+2

Impossibile riprodurre su GCC4.6.2/Boost 1.48. Tuttavia, ottengo 8 byte in 1 blocco "ancora raggiungibile". A proposito, funziona perfettamente con '' invece di Boost. –

+0

@sehe: a giudicare dallo stacktrace non ha nulla a che fare con il boost. È pthread_create() alloca strutture per TLS. Vedi http://www.akkadia.org/drepper/tls.pdf. –

risposta

4

Ho trovato che il problema è con la libreria pthread. Se eseguo il programma su SUSE 10, ottengo le perdite di memoria, ma se lo eseguo su SUSE 11, non ho il problema.

Ottengo gli stessi risultati con e senza Boost.

Grazie per i commenti. Questo mi ha aiutato a individuare il problema.

Problemi correlati