C++ 提高池使用率-单例

C++ 提高池使用率-单例,c++,boost,C++,Boost,我已经开始使用boost/pool/singleton_pool.hpp中定义的boost池,因为我需要重复分配许多相同大小的结构。性能的提高是惊人的,就像我以前使用malloc一样 我分配的对象由生产者线程放入一个列表中,消费者线程从另一端取下这些对象并释放对象。但当我释放对象时,任务管理器中进程的内存使用量永远不会减少。我猜这是因为池库预先分配了一定量的内存 此外,当生成器的数据速率增加时,总内存使用量似乎会增加(以块为单位,约10k),但即使在调用池中的对象的空闲后,也不会减少 我想定期做

我已经开始使用boost/pool/singleton_pool.hpp中定义的boost池,因为我需要重复分配许多相同大小的结构。性能的提高是惊人的,就像我以前使用malloc一样

我分配的对象由生产者线程放入一个列表中,消费者线程从另一端取下这些对象并释放对象。但当我释放对象时,任务管理器中进程的内存使用量永远不会减少。我猜这是因为池库预先分配了一定量的内存

此外,当生成器的数据速率增加时,总内存使用量似乎会增加(以块为单位,约10k),但即使在调用池中的对象的空闲后,也不会减少

我想定期做一些内部管理来释放内存块,以减少进程的总体内存使用。这可能吗?我不能使用purge_内存,因为这意味着我必须在产品和消费者之间同步清除。顺便说一句,purge_内存是否释放块,即减少任务管理器中的内存使用

我在微软视窗下编程

谢谢 尼拉德利

PS-我尝试通过使池有序(有序的malloc)来使用release_内存,但它总是返回false

更新:


尚未尝试清除内存,因为池在两个线程之间共享。但我们发现,release_内存只对有序池有效,而且释放内存的速度很慢,因为它只释放内存块,而不进行分配


我相信清除会更快。

这就是
boost::pool
的工作原理,这就是您的分配速度如此之快的原因。当您取消分配对象时,实际上并不是取消分配任何内容<代码>boost::pool基本上是说内存区域可用于另一个大小相同的对象。所以不,当您释放对象时,您不会看到内存使用率下降,因为对象池就是这样工作的。您有一块预先分配的内存,并使用该内存块创建对象。一个“对象池”,实际上是:)

根据:

bool t.释放内存()

必须订购。释放没有任何已分配块的所有内存块。如果至少有一个内存块被释放,则返回true

bool t.清除内存()

释放每个内存块。此函数使之前由t的分配函数返回的任何指针无效。如果至少有一个内存块被释放,则返回true

因此,要释放内存,需要使用
purge\u memory()
。只有当你从池中得到的每一个指针不再被使用时,你才能这样做

如果
release\u memory
返回true,则表明您的内存仍在使用中


my2c尚未尝试清除内存,因为池在两个线程之间共享。 但我们发现,release_内存只对有序池有效,而且释放内存的速度很慢,因为它只释放内存块,而不进行分配


我相信清除工作会更快。

谢谢,这证实了我的假设。有没有办法摧毁这个对象池并重新开始?或者有办法找出块是如何存在的?@user544550,正如neuro在下面指出的,
purge\u memory
将其清除,但正如他所说,任何分配的对象现在都是垃圾。谢谢,当至少释放一个内存块时,relase\u memory返回true。在我的情况下,它总是返回false,即使我已确保为每个已订购的\u malloc调用了free。@用户:我最好的猜测是您需要使用purge\u内存。。。我在linux上,所以我不能做测试…据我所知,至少在当前版本1.5.5中,boost::pool文档完全没有说明
release\u memory
purge\u memory
之间的区别。我很高兴看到这篇帖子。@Dan:这是发帖时的1.45.0版本。他们可能已经改变了行为。。。检查代码!请不要使用答案发布问题的更新。向问题添加注释,或使用“编辑”按钮将更新附加到原始问题。这是为了确保人们在花时间编写可能不再相关的答案之前了解您的问题/问题的最新情况。如果因为无法释放已用内存而速度较慢,对我来说,这是一项功能,而不是一个问题:)您可以向线程发送命令,暂停/停止处理并禁止使用内存,在呼叫清除之前?您试图解决的确切用例是什么?