2011-11-18 24 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

你可以自己消除phtread(通過簡單地使用pthread_create/pthread_join而不增強) – sehe

+2

無法在GCC4.6.2/Boost 1.48上重現。但是,我確實在1個塊中獲得了8個字節「仍可到達」。順便說一句,它'''完全正常,而不是Boost。 –

+0

@sehe:從堆棧跟蹤來看,它與boost沒有任何關係。它是pthread_create()爲TLS分配結構。見http://www.akkadia.org/drepper/tls.pdf。 –

回答

4

我發現問題與pthread庫有關。如果我在SUSE 10上運行該程序,則會發生內存泄漏,但如果我在SUSE 11上運行它,則不會出現問題。

無論是否使用Boost,我都可以得到相同的結果。

感謝您的意見。這幫助我指出了這個問題。