TBB生成任务内存泄漏

TBB spawn task memory leak

本文关键字:内存 泄漏 任务 TBB      更新时间:2023-10-16

我们有一段代码,利用TBB来生成任务来执行一些处理,这是使用以下TBB代码来初始化TBB线程池(以匹配内核数量):

tbb::task_scheduler_init(8);
然后,对于我们想要生成的每个任务,我们使用以下代码(其中MainTask派生自tbb::task类):
task = new (tbb::task::allocate_root()) MainTask(theAction, theOutputData);
tbb::task::enqueue(*task);

当我们运行代码时,我们开始使用一定数量的内存,然后随着程序的执行和生成新的任务,如上所述,内存使用随着时间的推移逐渐增加。在40分钟的执行中,它从12KB增加到213KB。这显然不是我们的任何处理代码的结果,似乎是由于TBB没有释放我们正在创建的TBB allocate_root任务的内存,一旦它们完成了它们的执行,就像我们期望的那样。

为什么会发生这种情况?是否还有其他的东西,我们需要做的是解决这个问题,或者有一些替代方法来生成TBB任务,而不使用allocate_root方法,将解决这个问题?

别担心。TBB缓存和重用任务内存以提高性能。它有特殊的机制来防止生产者-消费者情况下的内存泄漏,即一个线程一直分配任务,而另一个线程只消耗它们。

如果您仍然怀疑存在内存泄漏,则需要进行更详细的测试,以证明内存消耗在初始上升之后不会停止(当然,它是非线性函数)。TBB有专门的单元测试来检测内存泄漏:参见src/test/test_task_leaks.cpp