【问题标题】:C++ / Windows: HeapAlloc() for contention-free per-thread heapsC++ / Windows:HeapAlloc() 用于无争用的每线程堆
【发布时间】:2012-09-25 12:17:13
【问题描述】:

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

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

【问题讨论】:

  • 我想比这更深入,以便包括所有库在内的所有内容也使用我的新堆。我发现 _crtheap 是一个全局变量,因此可能无法在每个线程的基础上设置它。

标签: c++ windows visual-c++ heap-memory crt


【解决方案1】:

如何做到这一点?

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

如果您想通过HeapCreate 使用每线程堆,并且您的分配/释放代码被合理地包含,那么您可以简单地在您的线程代码中显式调用HeapAllocHeapFree。但是,如果这与性能良好的标准 CRT 分配器一样快,我会感到惊讶。

【讨论】:

    【解决方案2】:

    很遗憾,没有安全且记录在案的方法来替换 CRT 堆。仅限黑客。

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

    对于malloc/free,没有这样的记录方式可以替换。大多数黑客都被描述为here

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这需要CRT的静态链接。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 2011-09-18
        • 2020-10-17
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多