写了一个简单的testing:
#include <iostream> #include <boost/thread.hpp> using namespace std; void myThreadRun() { cout << "Thread id: " << boost::this_thread::get_id() << "\n"; } int main() { for (int i = 0; i < 10000; i++) { boost::thread t(myThreadRun); t.join(); } return 0; }
Valgrind Massif显示如下图表:
(启用了堆栈分析,平台:Linux Ubuntu x86)。
这个程序实际上并没有内存泄漏:内存使用情况稳定。
我想知道:是Valgrind还是boost :: thread的问题? 或者,也许我误解了一些东西?
你会如何解释?
这不是boost :: threads,它只是普通的pthreads。 我从这里抓取了示例程序(Pthread Creation and Termination),将线程数量提高到1000,并编译为普通的C语言,并且在使用地块处理时看到相同的行为。 所以无论是pthreads还是valgrind / massif正在做的事情。
编辑:使用程序(Pthread连接)以及。 见第二张图。
创建和终止:
KB 547.6^ # | @@@# | @@@@@@@# | @@@@@@@@@@# | @@@@@@@@@@@@@# | ::::@@@@@@@@@@@@@# | ::::: ::@@@@@@@@@@@@@# | @@@::::: ::@@@@@@@@@@@@@# | @@@@@@@::::: ::@@@@@@@@@@@@@# | @@@@@@@@@@::::: ::@@@@@@@@@@@@@# | @@@@@@@@@@@@@::::: ::@@@@@@@@@@@@@# | @@@@@@@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@# | @@@@@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@# | @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@# | ::@@@@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@# | @@@::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@# | @@@@ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@# | @@@@@@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@# | :::::@@@ @@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@# | :@@: :: @@@ @@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@# 0 +----------------------------------------------------------------------->Mi 0 13.22
Pthread加入,减去数学繁忙的工作:
KB 548.8^ # | @@#:: | :::@@#:: | ::::::@@#::: | ::::: :::@@#::::: | @@@@::::: :::@@#::::: | @@@@@ ::::: :::@@#::::::: | :@@:@@@@@ ::::: :::@@#:::::::@ | @@@:@ :@@@@@ ::::: :::@@#:::::::@ | :::@ @:@ :@@@@@ ::::: :::@@#:::::::@:: | @@@:: @ @:@ :@@@@@ ::::: :::@@#:::::::@:: | @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@:: | @:::@@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@:: | ::@@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@:: | ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@:: | :@@::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@:: | @@@:@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@:: | @@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@:: | @@@:@@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@:: | @@@@ :@@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@:: 0 +----------------------------------------------------------------------->Mi 0 19.14
即使在valgrind的情况下,加入应该最终会缩小堆栈的大小。
你的代码不会给清理工作带来机会。 当你在线程上调用join
时,它会一直等到线程完成,而不是所有资源的实际释放。 如果您更慢地创建线程或在循环中放置延迟或产量,“泄漏”将消失。