C:内存池库?

8
我需要一个快速、线程安全的内存池库。我已经搜索了很多,但是快速解决方案没有线程安全性,而其他解决方案则非常庞大。
有什么建议吗?

为什么不直接使用malloc()?它太慢了吗?你尝试过一些线程池吗?它更快,但会浪费一些内存。 - J-16 SDiZ
我每秒钟都有数百个小块(<500b)的malloc/free,所以是的,只有free/malloc真的很慢。我还想得到一些线程安全的解决方案,这样我就不用在线程中管理池时头疼了。 - Daniel
还要考虑竞技场内存管理。如果适合您,它将快得多。 - Joshua
4个回答

8

nedmalloc和ptmalloc都是以C为基础的线程缓存内存管理器,基于Doug Lea的malloc(大多数Linux分配器的核心)。它们都有良好的许可证,而不像Hoard,后者需要商业使用付费。Google的tcmalloc也有C绑定,是从头开始构建的线程缓存分配器,并具有一些内置的堆和CPU分析工具。然而,它是为大规模内存使用量构建的(他们给出的示例是每个线程的300 MB+),因此对于较小规模的应用程序可能效果不如预期。


1

每个线程应该使用一个内存池。


2
请注意,虽然这可以帮助解决问题,但仍然需要关注线程问题 - 虽然您可以确保从特定线程分配的内存块可以被指向特定的池,但您必须准备好在任何线程中为任何池释放内存块。 - Michael Burr
为什么我应该为每个线程使用单独的内存池? - Daniel
这也可能导致一个线程竞技场在其自由存储器中保留数百兆字节的内存,使其他实际需要分配内存的线程竞技场饥饿。 - Necrolis
1
这样可以通过不需要信号量来实现高速。为了做到这一点,您需要进行整个程序的优化,以确保任何使用内存池的人都不会通过错误的内存池进行解除分配。 - Joshua
这听起来是个好主意,但显然C标准库中没有对此的支持。你知道有哪些好的C池分配器库吗?我对talloc很感兴趣,但我想要一些不会增加动态调用析构函数开销的东西。 - isekaijin
由于某种原因,我假设是Windows。请参见CreateHeap、HeapAlloc等。 - Joshua

0

我尝试了 APR 作为第一种方法,但它非常庞大且有太多我根本不会使用的 API。 - Daniel

0

我已经看到它了,但似乎更像是一种针对现有应用程序的快速解决方案(LD_PRELOAD),而我需要对池子进行更多的控制(大小、最大大小、当前使用情况等...)。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接