微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

在Linux中启动认堆大小?

dynamic设置java进程的最大堆大小

Eclipse将堆释放回系统

libGL堆使用情况

在C#GetWriteWatch()?

如何才能做到这一点?

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

如果你想在HeapCreate使用per-thread堆,并且你的分配/解除分配代码是合理的,那么你可以直接在你的线程代码中直接调用HeapAlloc和HeapFree 。 但是,如果这个速度和标准的CRT分配器一样好,我会感到惊讶的。

不幸的是,没有安全和文件化的方法来取代CRT堆。 只有黑客。

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

对于malloc / free ,没有这样的文档替换方法。 大部分的黑客都在这里描述。

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

当然,这只会“捕捉”实际使用新的和删除的情况:-)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐