C++ / Windows:HeapAlloc() 用于无争用的每线程堆

Posted

技术标签:

【中文标题】C++ / Windows:HeapAlloc() 用于无争用的每线程堆【英文标题】:C++ / Windows: HeapAlloc() for contention-free per-thread heaps 【发布时间】:2012-09-25 12:17:13 【问题描述】:

我有一个使用boost::thread 的多线程应用程序。出于性能原因,我希望每个线程都有一个独立的堆。

我可以使用HeapCreate() 创建一个堆,但不清楚如何将它连接到 CRT 库,以便newmalloc 在创建的堆上分配内存。如何做到这一点?

【问题讨论】:

我想比这更深入,以便包括所有库在内的所有内容也使用我的新堆。我发现 _crtheap 是一个全局变量,因此可能无法在每个线程的基础上设置它。 【参考方案1】:

如何做到这一点?

如果不完全替换整个内存分配器,就无法做到这一点。例如,可扩展内存管理器Hoard 就是这样做的。但是替换内存分配器不适合胆小的人。

如果您想通过HeapCreate 使用每线程堆,并且您的分配/释放代码被合理地包含,那么您可以简单地在您的线程代码中显式调用HeapAllocHeapFree。但是,如果这与性能良好的标准 CRT 分配器一样快,我会感到惊讶。

【讨论】:

【参考方案2】:

很遗憾,没有安全且记录在案的方法来替换 CRT 堆。仅限黑客。

对于new/delete 语句,您可以提供全局operator new()operator delete(),它们将根据当前线程在所需堆中分配/释放内存。线程本地存储(TLS)通常用于存储线程本地堆句柄。

对于malloc/free,没有这样的记录方式可以替换。大多数黑客都被描述为here。

【讨论】:

【参考方案3】:

您可以提供一个“全局运算符 new”,您可以使用它来检查您所在的线程并从适当的堆中返回内存。当然,您还需要提供自己的“全局删除”。

当然,这只会“捕获”实际使用 new 和 delete 的情况:-)

【讨论】:

【参考方案4】:

另一种方法:使用多个 DLL,除了名称之外,每个 DLL 都相同。每个线程加载不同的 DLL。

【讨论】:

这需要CRT的静态链接。

以上是关于C++ / Windows:HeapAlloc() 用于无争用的每线程堆的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 C++:malloc()/HeapAlloc 总是为最小的分配大小分配新页面

[转]内存分配malloc, new , heapalloc

malloc 和 HeapAlloc 之间是不是存在根本区别(除了可移植性)? [复制]

malloc 和 free 是如何实现的?

HeapAlloc簿记

程序最多能new多少内存(2G内存里要放程序的5大区,HeapAlloc比new要快多了,而且超过2G的时候会告诉你)