Boost线程泄漏问题(C++)

17

请问boost thread库是否存在内存泄漏问题?我感觉是有的: Google上说我应该同时使用boost thread和pthread进行编译,在1.40版本中已经解决了这个问题,但我仍然遇到了泄漏问题。请注意,虽然可以正常编译但是检测到了泄漏。

#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 仍然存在同样的问题。


请查看boost源代码中的src/pthread/Once.cpp文件。很明显它不会泄漏(只需查找它使用的pthread库函数的定义即可)。 - Mankarse
使用std::thread而不是boost,代码甚至无法运行;它以std::system_error异常终止。 - Kerrek SB
只需尝试上面链接中的代码,很可能就会从valgrind中看到泄漏。 - Testboo Boos
1个回答

10

这与boost 1_46_1有关,所以对于您使用的版本可能不适用。如果您确实想自己验证,请查看boost源代码。(当我运行您的示例代码时,OSX上的泄漏检测器没有检测到任何泄漏)。

除非pthread、您使用的过时版本的boost或者您的编译器存在bug,否则这不是真正的泄漏。

get_once_per_thread_epoch mallocs一段新的uintmax_t内存,并使用一个带有关联析构函数的epoch_tss_key映射到线程本地存储中,以释放映射的数据。因此,malloc内存得到了保证,会被释放。

我真的不明白为什么valgrind将其检测为泄漏,但可能是因为pthread退出函数在valgrind之后某个时间点执行。另一个可能性是pthread函数本身存在泄漏,但我没有在文档中看到任何暗示这种情况的内容。


谢谢。我已经升级到1.46.1版本,但是valgrind仍然报同样的错误。直接使用pthread编码不会导致这个错误。就像你所说的那样,清理线程是在valgrind能够检测到之后完成的。 - Testboo Boos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接