Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ TBB可能的内存泄漏_C++_C++11_Memory Leaks_Valgrind_Tbb - Fatal编程技术网

C++ TBB可能的内存泄漏

C++ TBB可能的内存泄漏,c++,c++11,memory-leaks,valgrind,tbb,C++,C++11,Memory Leaks,Valgrind,Tbb,测试程序: #include <tbb/parallel_invoke.h> int main(void) { tbb::parallel_invoke([]{},[]{}); return 0; } libtbb版本:4.0,valgrind版本:3.8.1 上述试验结果的一部分: possibly lost: 1,980 bytes in 6 blocks 问题是: 这是一个TBBbug吗 或者是这个代码>可能丢失的实际上是安全的,只是ValgRink不考

测试程序:

#include <tbb/parallel_invoke.h>

int main(void)
{
    tbb::parallel_invoke([]{},[]{});
    return 0;
}
  • libtbb
    版本:
    4.0
    valgrind
    版本:
    3.8.1

  • 上述试验结果的一部分:

    possibly lost: 1,980 bytes in 6 blocks
    
    问题是:

    这是一个
    TBB
    bug吗


    <>或者是这个代码>可能丢失的<代码>实际上是安全的,只是ValgRink不考虑安全的一些代码?

    最有可能的是,它是假阳性,而不是bug。至少有几个原因:

  • TBB使用自己的内存分配器
    libtbbmalloc
    ,它缓存内存直到进程终止,并可能显示为泄漏
  • TBB线程异步运行和终止。很可能在
    main()
    终止后,工作线程仍在运行。这给valgrind带来了同样的印象
  • 为了合理地指控TBB泄漏,排除上述因素,例如:

  • 删除libtbbmalloc.so.2或tbbmalloc.dll文件,以便使用env.variable
    TBB_VERSION=1运行应用程序将输出
    TBB:ALLOCATOR malloc
    但不输出
    TBB:ALLOCATOR scalable\u 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;
    }
    
    intmain()
    {
    断言(tbb::tbb_分配器::分配器_类型()!=tbb::tbb_分配器::可伸缩);
    {//TBB范围
    tbb::task_scheduler_init作用域;
    tbb::parallel_invoke([]{},[]{});
    }//TBB线程从这里开始终止
    sleep(10);//等待线程终止
    返回0;
    }
    
    我在使用tbb时也遇到内存泄漏问题。同样的问题,但只是在我将tbb升级到4.3之后。在使用4.2之前,它在没有泄漏的情况下工作。我使用VLD检测泄漏。我怀疑当调度程序结束运行时,任务根本没有被破坏。TBB中肯定存在内存泄漏:看看在main末尾插入
    sleep(10)
    无法通过代码检查的环境中如何?对于这个问题,是否有一个解决方法,允许我使用TBB和valgrind,但不使用
    sleep(10)
    ?例如,要求TBB阻塞直到所有工作线程完全关闭的某种方法?它是诊断问题的方法,而不是用于course@Quuxplusone,有预览功能,允许等待线程终止。所以,如果睡眠解决了这个问题,你可以考虑这个代码的终止特性:<代码> TBB::TaskJPosithRixIn
    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;
    }