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。至少有几个原因:
libtbbmalloc
,它缓存内存直到进程终止,并可能显示为泄漏main()
终止后,工作线程仍在运行。这给valgrind带来了同样的印象TBB_VERSION=1运行应用程序将输出TBB:ALLOCATOR malloc
但不输出TBB:ALLOCATOR scalable\u malloc
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;
}