2011-06-12 189 views
17

有人能讓我知道boost線程庫是否泄漏。在我看來,它確實: 谷歌說我應該使用boost線程和pthread來編譯我正在做的,而在版本1.40中這個問題已經解決了,但是我仍然有漏洞。請注意,這將編譯得很好,但會檢測到泄漏。Boost線程泄漏C++

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

void t1(){} 

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

隨着Valgrind的我得到以下輸出

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 

我也試圖與在以下網站上列出的代碼:http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html 還是同樣的問題。

+0

看看boost源文件中的src/pthread/Once.cpp。很明顯,它不會泄漏(只需查找它使用的pthread庫函數的定義)。 – Mankarse 2011-06-12 11:23:22

+0

使用'std :: thread'而不是boost,代碼甚至不會運行;它終止於一個'std :: system_error'異常。 – 2011-06-12 11:41:04

+0

只是嘗試在上面的鏈接代碼,你最有可能會看到valgrind – 2011-06-12 18:32:11

回答

10

這與升級1_46_1有關,因此它可能不適用於您正在使用的版本。如果你真的想說服自己,請看助推源。 (當我運行您的示例代碼時,OSX上的泄漏檢測器未檢測到任何泄漏)。

這不是一個實際的泄漏(除非pthreads,您使用的過時版本的boost或您的編譯器存在缺陷)。

get_once_per_thread_epoch mallocs一個新的uintmax_t並映射到線程本地存儲與epoch_tss_key有一個相關的析構函數釋放映射的數據。因此,malloced內存保證被釋放。

我真的不明白爲什麼valgrind會將此檢測爲泄漏,但可能是因爲pthread退出函數在valgrind函數之後的某個點執行。另一種可能是pthread函數本身在泄漏,但我沒有在文檔中看到任何暗示這種情況的東西。

+0

謝謝。我升級到1.46.1和valgrind發生同樣的錯誤。直接使用pthread編碼不會導致此錯誤。必須像你說的那樣,Valgrind可以檢測到線程的清潔 – 2011-06-12 18:33:46