为什么多线程会占用我的内存?

3
我有一个Windows C++应用程序,其中包含一个std::hash_set,其中包含大约5百万个条目,每个条目都有32字节。如果我在单独的线程中创建hash_set,则根据ProcessExplorer使用> 1 GB。当我释放列表时,我可以看到这一点。如果我在主线程中创建它,则使用200 MB。这种现象仅适用于我的应用程序的32位版本。它不会在x64版本中发生。我使用Win XP x64双四核。这不是内存泄漏。在clear()上释放了所有内容。
我的猜测:Windows 32位不适合许多线程/许多核心。
你的猜测是什么?

3
可能性极小,但进程管理器可能存在错误。 - anon
5
每个线程都有一个关联的堆栈,但是除非你启动了许多数百个线程,否则这无法解释所有那些内存。需要代码来做出“值得回答”的猜测,但Win32确实很好地进行了多线程处理;其他情况也可能存在。 - Kevin Montrose
@neil:我也用vmmap进行了双重检查。我知道所有这些工具都不是完全准确的,但它们并不完全错误。最重要的是:使用线程时,32位应用程序的内存耗尽速度更快。@Kevin:我在高峰期使用大约20-30个线程。其中大多数在线程调用clear()之前被终止。 - RED SOFT ADAIR
1个回答

6
数据结构最终从堆中分配,而且无论线程如何,都是同一个堆。从不同的线程进行堆调用不会影响内存分配量。要么你的工具在误导你,要么你不小心在其他几个线程上分配了hash_set。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接