繁体   English   中英

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

[英]C++ / Windows: HeapAlloc() for contention-free per-thread heaps

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

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

如何才能做到这一点?

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

如果要在HeapCreate使用每线程堆,并且分配/释放代码合理地包含在其中,则可以在线程代码中显式调用HeapAllocHeapFree 但是,如果这和性能良好的标准CRT分配器一样快,我会感到惊讶。

不幸的是,没有安全且有据可查的替换CRT堆的方法。 仅骇客。

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

对于malloc / free ,没有记录的这种替换方法。 此处介绍大多数技巧。

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

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

另一种方法:使用多个DLL,每个DLL的名称完全相同。 每个线程加载一个不同的DLL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM