【发布时间】: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