2011-11-18 1 views
10

난 후, 별도의 therad에서 일부 조치를 실행 등이 하나의 스레드에 연결하는 프로그램이 있습니다Valgrind의는 '가능한 손실'메모리를보고

#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; 
} 

내가 실행하는 경우 Valgrind의를 그것에, 그것은 아마도 '잃어버린'기억을보고합니다. join()을 생략하면 논리적 인 것처럼 보입니다.이 경우 프로그램이 종료 될 때 스레드가 계속 실행되기 때문입니다. 그러나 스레드가 완료되면 경고가 없다는 것을 기대할 수 있습니다. 여기

는 역 추적입니다 :

==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) 

이 부스트 스레드, POSIX 스레드에 문제가 아니면이 완벽하게 정상입니까? 나는 그것에 대한 억압 규칙을 만들 수 있지만 미완성 스레드가있는 경우 경고가 표시되지만 모든 스레드가 완료 될 때가 아니라면 좋을 것입니다.

+3

당신은 (단지 pthread_create/pthread_join을 boost하지 않고) phtread를 제거 할 수 있습니다. – sehe

+2

GCC4.6.2/Boost 1.48에서 재현 할 수 없습니다. 그러나, 나는 여전히 "도달 할 수있는"1 블록에서 8 바이트를 얻는다. 그건 그렇고, 그것을 부스트 대신''완벽하게 잘 작동합니다. –

+0

@sehe : stacktrace로 판단하면 부스트와는 아무런 관련이 없습니다. pthread_create()는 TLS에 대한 구조를 할당합니다. http://www.akkadia.org/drepper/tls.pdf를 참조하십시오. –

답변

4

문제는 pthread 라이브러리에서 발견되었습니다. SUSE 10에서 프로그램을 실행하면 메모리 누수가 발생하지만 SUSE 11에서 실행하면 문제가 발생하지 않습니다.

부스트가 있거나없는 동일한 결과가 나타납니다.

의견에 감사드립니다. 그게 제가 문제를 정확하게 지적하는데 도움이되었습니다.