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線程問題或者是這很正常?我可以爲它創建一個抑制規則,但如果在未完成的線程中收到警告,但在所有線程完成時都收到警告,這也會很好。
你可以自己消除phtread(通過簡單地使用pthread_create/pthread_join而不增強) – sehe
無法在GCC4.6.2/Boost 1.48上重現。但是,我確實在1個塊中獲得了8個字節「仍可到達」。順便說一句,它'''完全正常,而不是Boost。 –
@sehe:從堆棧跟蹤來看,它與boost沒有任何關係。它是pthread_create()爲TLS分配結構。見http://www.akkadia.org/drepper/tls.pdf。 –