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 库,以便new
和malloc
在创建的堆上分配内存。如何做到这一点?
【问题讨论】:
我想比这更深入,以便包括所有库在内的所有内容也使用我的新堆。我发现 _crtheap 是一个全局变量,因此可能无法在每个线程的基础上设置它。 【参考方案1】:如何做到这一点?
如果不完全替换整个内存分配器,就无法做到这一点。例如,可扩展内存管理器Hoard 就是这样做的。但是替换内存分配器不适合胆小的人。
如果您想通过HeapCreate
使用每线程堆,并且您的分配/释放代码被合理地包含,那么您可以简单地在您的线程代码中显式调用HeapAlloc
和HeapFree
。但是,如果这与性能良好的标准 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