测试程序:
#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
bug?
或者是这个possible lost
实际上是安全的,只是一些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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)