2011-06-12 4 views
17

누군가가 부스트 스레드 라이브러리 유출 여부를 알려 줄 수 있습니까? 그것은 나에게 보인다 : 구글은 내가하고있는 boost thread와 pthread 모두로 컴파일해야한다고 말했고 버전 1.40에서는이 문제가 수정되었지만 여전히 누수가있다. 이 컴파일 잘되지만 누수가 감지됩니다 것을 유의하십시오. 아직 http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html 같은 문제 : Valgrind의와부스트 스레드 누설 C++

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

void t1(){} 

int main(void){ 
boost::thread th1(t1); 
th1.join(); 
return 1; 
} 

은 내가 또한 다음 웹 사이트에 나와있는 코드로 시도

HEAP SUMMARY: 
==8209==  in use at exit: 8 bytes in 1 blocks 
==8209== total heap usage: 5 allocs, 4 frees, 388 bytes allocated 
==8209== 
==8209== 8 bytes in 1 blocks are still reachable in loss record 1 of 1 
==8209== at 0x4024F20: malloc (vg_replace_malloc.c:236) 
==8209== by 0x4038CCB: boost::detail::get_once_per_thread_epoch() (in /usr/local/lib/libboost_thread.so.1.42.0) 
==8209== by 0x40329D4: ??? (in /usr/local/lib/libboost_thread.so.1.42.0) 
==8209== by 0x4032B26: boost::detail::get_current_thread_data() (in /usr/local/lib/libboost_thread.so.1.42.0) 
==8209== by 0x4033F32: boost::thread::join() (in /usr/local/lib/libboost_thread.so.1.42.0) 
==8209== by 0x804E7C3: main (testboost.cpp) 
==8209== 
==8209== LEAK SUMMARY: 
==8209== definitely lost: 0 bytes in 0 blocks 
==8209== indirectly lost: 0 bytes in 0 blocks 
==8209==  possibly lost: 0 bytes in 0 blocks 
==8209== still reachable: 8 bytes in 1 blocks 
==8209==   suppressed: 0 bytes in 0 blocks 

다음과 같은 출력을 얻을.

+0

부스트 소스에서 src/pthread/Once.cpp를보십시오. 그것이 누설되지 않는다는 것은 꽤 분명하다. (단지 pthread 라이브러리 함수의 정의를 보라.) – Mankarse

+0

부스트 대신에'std :: thread'를 사용하면 코드가 나를 위해 실행되지 않습니다. 'std :: system_error' 예외로 종료됩니다. –

+0

위의 링크에서 코드를 시도하면 valgrind에서 누수가 가장 잘 보일 것입니다. –

답변

10

이것은 1_46_1을 부울과 관련되어 있으므로 사용중인 버전에 해당하지 않을 수 있습니다. 진실을 확신하고 싶다면 부스트 소스를보십시오. (OSX의 누설 감지기는 예제 코드를 실행할 때 누수를 감지하지 못합니다.)

이것은 실제 누설이 아닙니다 (pthreads, 사용중인 부스트의 오래된 버전 또는 컴파일러가있는 버그가없는 한).

get_once_per_thread_epoch 새로운 매핑을 매핑하고 매핑 된 데이터를 해제하는 연관된 소멸자가있는 epoch_tss_key을 스레드 로컬 저장소에 매핑합니다. 따라서 malloced 메모리는 해제 될 수 있습니다.

valgrind가 누수 감지 이유는 모르지만 실제로는 pthreads 종료 함수가 valgrind 이후의 일부 지점에서 실행되고 있기 때문일 수 있습니다. 또 다른 가능성은 pthread 함수 자체가 유출되었다는 것입니다. 그러나이 경우 문서에서 아무 것도 볼 수 없습니다.

+0

감사합니다. 나는 1.46.1로 업그레이드했고 valgrind에서 같은 오류가 발생했습니다. pthread로 직접 코딩해도이 오류가 발생하지 않습니다. valgrind가 감지 할 수있을 때 스레드의 청소가 완료되었다고해야합니다. –

관련 문제