c – TBB可能的内存泄漏

测试程序:

#include <tbb/parallel_invoke.h>

int main(void)
{
    tbb::parallel_invoke([]{},[]{});
    return 0;
}

>使用g -std = c 11 tmp.cpp -ltbb编译
>检查

valgrind --tool=memcheck --track-origins=yes \
         --leak-check=full --log-file=report ./a.out`

> libtbb版本:4.0,valgrind版本:3.8.1.

部分上述测试结果:

possibly lost: 1,980 bytes in 6 blocks

问题是:

这是TBB的错误吗?

或者这可能会丢失实际安全,这只是valgrind认为不安全的一些代码?

最佳答案 最有可能的是,这是一个误报,而不是一个错误.至少有几个原因:

> TBB使用自己的内存分配器libtbbmalloc,它将内存缓存到进程终止并且可能显示为泄漏.
> TBB线程以异步方式运行和终止.很可能在main()终止后,工作线程仍在运行.它给valgrind带来了同样的印象

为了合理控制TBB泄漏,排除上述因素,例如:

>删除libtbbmalloc.so.2或tbbmalloc.dll文件,以便运行带有env.variable TBB_VERSION = 1的应用程序将输出TBB:ALLOCATOR malloc但不输出TBB:ALLOCATOR scalable_malloc
>确保所有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;
}
点赞