2011-06-12 36 views
17

Birisi, iş parçacığı kitaplığı sızıntılarını arttırıp artırmadığını bana bildirebilir. Bana öyle geliyor ki: Google, yaptığım boost ipliği ve pthread ile derlemem gerektiğini ve 1.40 sürümünde bu sorunun düzeltildiğini ancak hala sızıntı yapmam gerektiğini söylüyor. Bunun iyi bir şekilde derleneceğini, ancak sızıntıların tespit edildiğini unutmayın. Yine http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html aynı sorun: valgrind ileTakviyeli iplik Sızıntı C++

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

void t1(){} 

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

ben de şu web sitesinde listelenen koduyla çalıştı

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 

aşağıdaki çıktı üretmesi olsun.

+0

Yükseltme kaynaklarında src/pthread/Once.cpp dosyasına bir göz atın. Sızıntı yapmadığı oldukça açıktır (sadece kullandığı pthread kitaplık işlevlerinin tanımlarını inceleyin). – Mankarse

+0

Yükseltme yerine 'std :: thread' kullanarak kod benim için bile çalışmıyor; bir std :: system_error' istisnasıyla sona erer. –

+0

sadece yukarıdaki bağlantıda kodu deneyin ve muhtemelen büyük olasılıkla –

cevap

10

Bu, 1_46_1 desteği ile ilişkilidir, bu nedenle kullandığınız sürüm için geçerli olmayabilir. Kendinizi ikna etmek istiyorsanız, destek kaynaklarına bakın. (OSX'deki kaçak dedektörü, örnek kodunuzu çalıştırdığımda herhangi bir sızıntı algılamıyor).

Bu, gerçek bir sızıntı değildir (ya pthreads, kullandığınız yükseltmenin eski sürümü veya derleyicinizle ilgili bir hata olmadıkça).

get_once_per_thread_epoch yeni uintmax_t mallocs ve eşlenen verileri kurtarır ilişkili bir yıkıcı olan bir epoch_tss_key ile iş parçacığı yerel-depolama içine eşler. Bu nedenle, malloced belleğin boşaltılması garantilidir.

Değerin neden bir sızıntı olarak algılandığını anlamıyorum, ancak bunun nedeni, pthreads çıkış işlevlerinin valgrind olanlardan sonra bir noktada yürütülmesi olabilir. Diğer olasılık, pthread işlevlerinin kendilerinin sızdırıyor olmasıdır, ancak belgede bu durumun olduğunu gösteren herhangi bir şey görmedim.

+0

Teşekkürler. 1.46.1'e ve aynı hatadan valgrind'e yükselttim. Pthread ile kodlama doğrudan bu hataya neden olmaz. Valginin algılamasının ardından iş parçacığının temizlendiğini söylediğin gibi olmalı. –