为什么Valgrind使用boost :: thread显示堆栈使用量增加?

写了一个简单的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显示如下图表:

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时,它会一直等到线程完成,而不是所有资源的实际释放。 如果您更慢地创建线程或在循环中放置延迟或产量,“泄漏”将消失。