测试程序:
#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
错误吗?
或者这个possible lost
实际上是否安全,只是valgrind认为不安全的一些代码?
答案 0 :(得分:2)
最有可能的是,这是一个误报,而不是一个错误。至少有几个原因:
libtbbmalloc
,它会缓存内存直到进程终止,并且可能显示为泄漏。main()
终止后,工作线程仍在运行。它会给valgrind带来同样的印象。为了合理控制TBB泄漏,请排除上述因素,例如:
TBB_VERSION=1
的应用程序将输出TBB: ALLOCATOR malloc
但不会TBB: ALLOCATOR scalable_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;
}