C++ 为什么Valgrind显示boost::thread增加了堆栈使用率?
写了一个简单的测试:C++ 为什么Valgrind显示boost::thread增加了堆栈使用率?,c++,linux,valgrind,boost-thread,C++,Linux,Valgrind,Boost Thread,写了一个简单的测试: #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;
#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;
}
#包括
#包括
使用名称空间std;
void myThreadRun(){
cout您的代码不会给清理提供机会。当您在线程上调用join
时,它会等待线程发出完成信号,而不是其所有资源的实际释放。如果您创建线程的速度较慢,或者在循环中设置延迟或让步,“泄漏”将消失。这不是boost::threads,它也发生在普通的Pthread上。我从(Pthread Creation and Termination)中获取了示例程序,将线程数增加到1000并编译为纯C,我在使用massif处理它时看到了相同的行为
编辑:也使用了程序(Pthread连接)。参见第二个图表
创建和终止:
KB
547.6^ #
| @@@#
| @@@@@@@#
| @@@@@@@@@@#
| @@@@@@@@@@@@@#
| ::::@@@@@@@@@@@@@#
| ::::: ::@@@@@@@@@@@@@#
| @@@::::: ::@@@@@@@@@@@@@#
| @@@@@@@::::: ::@@@@@@@@@@@@@#
| @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
| @@@@@@@@@@@@@::::: ::@@@@@@@@@@@@@#
| @@@@@@@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
| @@@@@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
| @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
| ::@@@@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
| @@@::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
| @@@@ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
| @@@@@@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
| :::::@@@ @@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
| :@@: :: @@@ @@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
0 +----------------------------------------------------------------------->Mi
0 13.22
Pthread连接,减去数学繁忙的工作:
KB
548.8^ #
| @@#::
| :::@@#::
| ::::::@@#:::
| ::::: :::@@#:::::
| @@@@::::: :::@@#:::::
| @@@@@ ::::: :::@@#:::::::
| :@@:@@@@@ ::::: :::@@#:::::::@
| @@@:@ :@@@@@ ::::: :::@@#:::::::@
| :::@ @:@ :@@@@@ ::::: :::@@#:::::::@::
| @@@:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
| @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
| @:::@@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
| ::@@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
| ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
| :@@::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
| @@@:@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
| @@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
| @@@:@@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
| @@@@ :@@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
0 +----------------------------------------------------------------------->Mi
0 19.14
看起来,即使在valgrind下,加入也会最终降低堆栈大小。在线程代码中没有任何std::cout
的情况下,您是否看到了相同的情况?哦,也可能是这样的:valgrind可能会取代线程处理,因此此特定数据可能实际上并不代表真正的程序配置文件。删除std::cout
没有改变任何东西。我复制了它,并尝试了几件事情试图修复或至少改变这种行为,但运气不佳。我仍在怀疑valgrind是否在幕后做了一些奇怪的事情。添加了boost::this_thread::sleep(boost::posix_time::毫秒(10))
进入循环并boost::this_thread::sleep(boost::posix_time::seconds(20))
在循环之后(程序退出之前)。图表保持完全相同。该示例程序既不分离也不连接其线程,因此它应该泄漏。他的程序连接其线程,因此它不应该泄漏。将两者进行比较毫无意义。那么,您不觉得行为如此相似很有趣吗?是的,现在您修复了错误。:)