【问题标题】:Why does Valgrind show increasing stack usage with boost::thread?为什么 Valgrind 使用 boost::thread 显示堆栈使用量增加?
【发布时间】:2012-09-07 18:23:09
【问题描述】:

写了一个简单的测试:

#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 的问题?还是我误解了什么?

你会怎么解释?

【问题讨论】:

  • 在线程代码中没有std::cout,你看到同样的东西吗?
  • Valgrind 可能会取代线程处理,因此这些特定数据可能实际上并不代表真实的程序配置文件。
  • 删除 std::cout 不会改变任何东西。
  • 我已经复制了这个并尝试了几件事来尝试修复或至少改变这种行为,但还没有运气。我仍然想知道 valgrind 是否在幕后做了一些奇怪的事情。

标签: c++ linux valgrind boost-thread


【解决方案1】:

您的代码不会让清理工作发生。当您在线程上调用join 时,它会一直等到线程发出完成信号,而不是实际释放其所有资源。如果您更慢地创建线程或在循环中设置延迟或让步,“泄漏”就会消失。

【讨论】:

  • 在循环中添加了boost::this_thread::sleep(boost::posix_time::milliseconds(10)),在循环之后(程序退出之前)添加了boost::this_thread::sleep(boost::posix_time::seconds(20))。图表保持完全一样。
【解决方案2】:

这不是 boost::threads,它也发生在普通的 pthreads 上。我从here(Pthread 创建和终止)中获取了示例程序,将线程数增加到 1000 并编译为纯 C,我在使用 massif 处理它时看到了相同的行为。所以要么是 pthreads 中的东西,要么是 valgrind/massif 正在做的事情。

编辑:也使用过程序(Pthread Joining)。见第二张图。

创建和终止:

    KB
547.6^                                                                       #
     |                                                                    @@@#
     |                                                                @@@@@@@#
     |                                                             @@@@@@@@@@#
     |                                                          @@@@@@@@@@@@@#
     |                                                      ::::@@@@@@@@@@@@@#
     |                                                  ::::: ::@@@@@@@@@@@@@#
     |                                               @@@::::: ::@@@@@@@@@@@@@#
     |                                           @@@@@@@::::: ::@@@@@@@@@@@@@#
     |                                        @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
     |                                     @@@@@@@@@@@@@::::: ::@@@@@@@@@@@@@#
     |                                @@@@@@@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
     |                            @@@@@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
     |                         @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
     |                     ::@@@@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
     |                  @@@::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
     |               @@@@ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
     |           @@@@@@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
     |      :::::@@@ @@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
     |   :@@: :: @@@ @@ @ @::@ @@@@@ @@ @@ @@ @@@@@@@@@@::::: ::@@@@@@@@@@@@@#
   0 +----------------------------------------------------------------------->Mi
     0                                                                   13.22

Pthread 加入,减去数学繁忙的工作:

    KB
548.8^                                                             #
     |                                                           @@#::
     |                                                        :::@@#::
     |                                                     ::::::@@#:::
     |                                                  ::::: :::@@#:::::
     |                                              @@@@::::: :::@@#:::::
     |                                            @@@@@ ::::: :::@@#:::::::
     |                                        :@@:@@@@@ ::::: :::@@#:::::::@
     |                                     @@@:@ :@@@@@ ::::: :::@@#:::::::@
     |                                  :::@ @:@ :@@@@@ ::::: :::@@#:::::::@::
     |                               @@@:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
     |                            @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
     |                        @:::@@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
     |                     ::@@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
     |                  ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
     |               :@@::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
     |            @@@:@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
     |         @@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
     |     @@@:@@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
     |   @@@@ :@@@@@ :@ ::@: @@:: @@:@ @:: @ @:@ :@@@@@ ::::: :::@@#:::::::@::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   19.14

看起来加入最终应该会降低堆栈大小,即使在 valgrind 下也是如此。

【讨论】:

  • 该示例程序既不分离也不加入其线程,因此它应该泄漏。他的程序加入了它的线程,所以它不应该。将两者进行比较是没有意义的。
  • 你不觉得有趣吗,那么,行为如此相似?
  • 是的,现在你已经修复了你的错误。 :)
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2011-05-18
  • 2012-01-22
  • 2018-02-12
  • 2013-03-15
  • 2017-08-18
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多