2

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

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

4

4 回答 4

3

如何才能做到这一点?

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

如果您想使用 per-thread heap with HeapCreate,并且您的分配/解除分配代码被合理地包含,那么您可以简单地在您的线程代码中显式调用HeapAlloc和调用。HeapFree但是,如果这与性能良好的标准 CRT 分配器一样快,我会感到惊讶。

于 2012-09-25T12:33:41.040 回答
2

不幸的是,没有安全且记录在案的方法来替换 CRT 堆。仅限黑客。

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

对于malloc/free没有这样的记录方式来替换。大多数 hack 都在此处进行了描述。

于 2012-09-25T12:34:28.007 回答
2

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

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

于 2012-09-25T12:34:42.860 回答
0

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

于 2012-09-25T15:26:05.577 回答