Mam program, który uruchamia pewne działania w osobnym therad, a następnie łączy się w wątku, takie jak ten:Valgrind donosi „ewentualnie utracone” pamięci podczas pracy z wątków Google 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;
}
Jeśli uruchomić Valgrind na nim zgłasza "potencjalnie zagubioną" pamięć. Wydaje się to logiczne, jeśli pomijam join()
, ponieważ w tym przypadku wątek nadal działa po wyjściu programu. Ale jeśli wątek zostanie zakończony, spodziewam się, że nie ma żadnych ostrzeżeń.
Oto 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)
Czy to problem z Boost, wątek, wątek Posix czy jest to całkowicie normalne? Mógłbym stworzyć dla niego regułę tłumienia, ale byłoby dobrze, gdybym dostał ostrzeżenie, jeśli jest niedokończony wątek, ale nie wtedy, gdy wszystkie wątki są zakończone.
Możesz samodzielnie wyeliminować phtread (po prostu używając pthread_create/pthread_join bez doładowania) – sehe
Nie można odtworzyć na GCC4.6.2/Boost 1.48. Jednak otrzymuję 8 bajtów w 1 bloku "wciąż osiągalnym". Nawiasem mówiąc, działa doskonale z '' zamiast wzmocnienia. –
@sehe: Sądząc po stosie, nie ma to nic wspólnego z boostem. To pthread_create() przydziela struktury dla TLS. Zobacz http://www.akkadia.org/drepper/tls.pdf. –