TBB可能存在内存泄漏

TBB possible memory leak

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

测试程序:

#include <tbb/parallel_invoke.h>
int main(void)
{
    tbb::parallel_invoke([]{},[]{});
    return 0;
}
  1. 使用g++ -std=c++11 tmp.cpp -ltbb
  2. 编译
  3. valgrind --tool=memcheck --track-origins=yes 
             --leak-check=full --log-file=report ./a.out`
    
  4. libtbb版本:4.0, valgrind版本:3.8.1

以上部分测试结果:

possibly lost: 1,980 bytes in 6 blocks

问题是:

这是TBB的bug吗?

或者这个possible lost实际上是安全的,它只是一些valgrind认为不安全的代码?

很可能是误报,而不是bug。至少有几个原因:

  1. TBB使用自己的内存分配器libtbbmalloc,它缓存内存直到进程终止,并且可以显示为泄漏。
  2. TBB线程异步运行和终止。很可能在main()终止后,工作线程仍在运行。对于valgrind
  3. 也会产生相同的印象

为了合理地指责TBB泄漏,排除上述因素,例如:

  1. 删除libtbbmalloc.so。2或tbbmalloc.dll文件,以便使用env. exe运行应用程序。变量TBB_VERSION=1将输出TBB: ALLOCATOR malloc但不输出TBB: ALLOCATOR scalable_malloc
  2. 确保所有TBB线程都被终止
例如

int main()
{
    assert(tbb::tbb_allocator<int>::allocator_type() != tbb::tbb_allocator<int>::scalable);
    { // TBB scope
        tbb::task_scheduler_init scope;
        tbb::parallel_invoke([]{},[]{});
    } // TBB threads start termination here
    sleep(10); // wait for threads to terminate
    return 0;
}