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))
在循环之后(程序退出之前)。图表保持完全相同。该示例程序既不分离也不连接其线程,因此它应该泄漏。他的程序连接其线程,因此它不应该泄漏。将两者进行比较毫无意义。那么,您不觉得行为如此相似很有趣吗?是的,现在您修复了错误。:)