2012-12-12 140 views
0

我正在嘗試加強線程,並且我從valgrind注意到,它僅僅通過循環訪問一個空的代碼塊而泄露了320個字節。我在2010年的谷歌上發現了一些帖子,表明它們可能是Valgind運行之前沒有關閉的線程的誤判,但是這略有不同。在這些示例中,您有幾塊仍然可以訪問的塊(因此,如果線程仍在運行,則可以自由運行),我的運行顯示8仍然可以到達,而20塊肯定丟失。這是我應該擔心的事情,還是我有些想念什麼?感謝升壓線程中的內存泄漏?

代碼

#include <boost/thread.hpp> 
#include <iostream> 
#define THREADS 20 

void threadfunc(int workerid) {} 

int main(int argc, char **argv){ 

    boost::thread *threads[THREADS]; 
    int i; 
    for (i = 0; i < THREADS; i++) { 
     threads[i] = new boost::thread(threadfunc, i); 
    } 
    for (i = 0; i < THREADS; i++) { 
     threads[i]->join(); 
    } 
} 

編譯命令

c++ -o example example.cpp -I /usr/include/boost -lboost_system -lboost_thread 

Valgind命令

G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind -v --tool=memcheck --leak-check=full --show-reachable=yes --num-callers=40 --log-file=valgrind.log ./example 

Valgine導致

==31674== HEAP SUMMARY: 
==31674==  in use at exit: 328 bytes in 21 blocks 
==31674== total heap usage: 103 allocs, 82 frees, 14,968 bytes allocated 
==31674== 
==31674== Searching for pointers to 21 not-freed blocks 
==31674== Checked 215,920 bytes 
==31674== 
==31674== 8 bytes in 1 blocks are still reachable in loss record 1 of 2 
==31674== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==31674== by 0x4E454A9: boost::detail::get_once_per_thread_epoch() (in /usr/lib/libboost_thread.so.1.46.1) 
==31674== by 0x4E3E4FF: ??? (in /usr/lib/libboost_thread.so.1.46.1) 
==31674== by 0x4E3E7C8: boost::detail::get_current_thread_data() (in /usr/lib/libboost_thread.so.1.46.1) 
==31674== by 0x4E3FF3A: boost::thread::join() (in /usr/lib/libboost_thread.so.1.46.1) 
==31674== by 0x402C79: main (in /home/Jason/php/base/example) 
==31674== 
==31674== 320 bytes in 20 blocks are definitely lost in loss record 2 of 2 
==31674== at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==31674== by 0x402C2A: main (in /home/Jason/php/base/example) 
==31674== 
==31674== LEAK SUMMARY: 
==31674== definitely lost: 320 bytes in 20 blocks 
==31674== indirectly lost: 0 bytes in 0 blocks 
==31674==  possibly lost: 0 bytes in 0 blocks 
==31674== still reachable: 8 bytes in 1 blocks 
==31674==   suppressed: 0 bytes in 0 blocks 
==31674== 
==31674== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2) 
--31674-- 
--31674-- used_suppression:  2 dl-hack3-cond-1 
==31674== 
==31674== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2) 
+0

「仍可達」的8個字節是我在每次使用boost-thread的valgrind運行中看到的。所以,我認爲這很正常(可能是他們必須做的事情),而且它似乎並不依賴於線程的數量或者隨着線程數量的增加而增長,它可能是一些獨特的全球數據,不會被釋放(有意)。無論如何,這個記憶將被回收,所以它沒有真正的關注。 ForEveR指出,對於另外20個「絕對丟失」的塊,很顯然,這些20個線程缺少'delete'調用。 –

+0

謝謝,不,它似乎不會增長。我昨天運行了一個線程PHP核心的測試,並且在重新創建了10個線程1000多次和3,000,000+個分配(是的,即6個零)之後,一個8字節塊是唯一的問題。 – JSON

回答

4

這是你的錯誤,而不是boost::thread s。 你的記憶沒有被釋放。

for (i = 0; i < THREADS; i++) { 
    threads[i] = new boost::thread(threadfunc, i); 
} 

退出主函數之前,您必須釋放內存(刪除線程)。 類似於

for (i = 0; i < THREADS; i++) { 
    delete threads[i]; 
} 

或在加入後下一次刪除。

+0

我的不好......... – JSON

+0

我幾乎掉在了我的那把劍上。這證明,即使咖啡不能讓我們繼續30小時後大聲笑 – JSON

+0

我有同樣的問題。使用「* _epoch」功能。但是,我不新增加boost :: thread。我的線程在main中分配在堆棧上。我加入他們,然後從主返回。我想知道你是否知道刪除這個錯誤(除了抑制)。它似乎來自於提振,但是 - 課程 - 它也可能是我正在做的事情。 – Bitdiot