【发布时间】:2011-09-13 09:02:58
【问题描述】:
有人可以告诉我 boost 线程库是否泄漏。在我看来,它确实: 谷歌说我应该用我正在做的 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 库函数的定义)。
-
使用
std::thread而不是boost,代码甚至不能为我运行;它以std::system_error异常终止。 -
只需尝试上面链接中的代码,您很可能会看到来自 valgrind 的泄漏
标签: c++ multithreading boost memory-leaks valgrind