TBB生成任务内存泄漏

时间:2016-06-24 12:02:51

标签: c++ tbb

我们有一段代码利用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方法?

1 个答案:

答案 0 :(得分:2)

不要担心。 TBB缓存并重用任务内存以提高性能。它有一个特殊的机制来防止生产者 - 消费者案件中的内存泄漏,其中一个线程继续分配任务而另一个线程只消耗它们。

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