我有一个使用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] 举报,一经查实,本站将立刻删除。