我有一个使用boost::thread
的multithreading应用程序。 出于性能原因,我想每个线程都有一个独立的堆。
我可以使用HeapCreate()
创build一个堆,但是我不清楚如何将它连接到CRT库,以便new
和malloc
在创build的堆上分配内存。 如何才能做到这一点?
如何才能做到这一点?
没有完全替换整个内存分配器就无法完成。 例如可扩展内存管理器Hoard就是这样做的。 但是更换内存分配器并不适合那些胆小的人。
如果你想在HeapCreate
使用per-thread堆,并且你的分配/解除分配代码是合理的,那么你可以直接在你的线程代码中直接调用HeapAlloc
和HeapFree
。 但是,如果这个速度和标准的CRT分配器一样好,我会感到惊讶的。
不幸的是,没有安全和文件化的方法来取代CRT堆。 只有黑客。
对于new
/ delete
语句,可以提供全局operator new()
和operator delete()
,它们将根据当前线程在所需堆中分配/解除分配内存。 线程本地存储(TLS)通常用于存储线程本地堆句柄。
对于malloc
/ free
,没有这样的文档替换方法。 大部分的黑客都在这里描述。
您可以提供一个“全局运算符new”,您可以使用它来检查您所在的线程,并从合适的堆中返回内存。 当然,您也需要提供自己的“全局删除”。
当然,这只会“捕捉”实际使用新的和删除的情况:-)
另一种方法:使用多个DLL,每个DLL除了名字都相同。 每个线程加载一个不同的DLL。