【问题标题】:Why do multiple threads eat my memory为什么多线程会吃掉我的内存
【发布时间】:2009-07-01 19:47:11
【问题描述】:

我有一个 Windows C++ 应用程序,它包含一个 std::hash_set,其中包含大约 500 万个条目,每个条目有 32 个字节。如果我根据 ProcessExplorer 在一个单独的(许多)线程中创建 hash_set,它使用 > 1 GB。当我释放列表时,我看到了这一点。如果我在主线程中创建它,它会占用 200 MB。此现象仅适用于我的应用程序的 32 位版本。它不会出现在 x64 版本中。我在 Win XP x64 上使用双四核。 它不是内存泄漏。一切都在 clear() 上释放。

我的猜测:Windows 32.Bit 不是为多线程/多核构建的。

你的客人是什么?

【问题讨论】:

  • 可以想象,进程资源管理器是错误的。
  • 每个线程都有一个关联的堆栈,但除非您启动数百个线程,否则这并不能解释所有内存。需要代码来做出“值得回答”的猜测,但 Win32 绝对可以很好地处理多线程;这里发生了其他事情。
  • @neil:我还用 vmmap 仔细检查过。我知道所有这些通行费都不准确——但也不是完全错误的。最重要的是:32 位应用程序在使用线程时会更快地耗尽内存。 @Kevin:我在高峰时间使用大约 20-30 个线程。它们中的大多数在调用 clear() 之前被终止。

标签: c++ windows multithreading


【解决方案1】:

数据结构最终从堆中分配,不管线程如何,都是同一个堆。从不同的线程进行堆调用不会影响分配的内存量。要么是您的工具在欺骗您,要么您无意中在其他几个线程上分配了 hash_set

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2012-02-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多