我创建了一个tbb :: task_group并为其添加了多个任务。最后我在wait()上完成任务。我正在分析代码并发现我的应用程序使用的线程数量增加了(在Window的任务管理器中可见)。但是,当tbb :: task_group对象被破坏时,线程数不会减少。
此外,如果我再次调用相同的代码块(不重新启动应用程序),则线程数有时会增加,有时不会增加。
这是预期的行为吗?如果是,我如何确保先前创建的线程被重用?
答案 0 :(得分:1)
是的,这是预期的行为。它专门用于在并行算法之间重用线程。您可以通过使用线程局部变量(TBB提供combinable
类)标记线程或查看task_scheduler_observer
的回调来验证它。
TBB始终但懒得创建初始化时指定的线程数 - 即使您只运行单个任务。默认情况下,TBB工作线程的数量等于应用程序线程的HW线程数(核心* HT)减去一个。
顺便说一句,我建议您不要使用适用于高级案例的tbb::task
,请先查看tbb::parallel_invoke
或tbb::task_group
哪些是任务的高级接口。或者甚至更好,看看您的算法是否可以使用parallel_for
,parallel_reduce
(可能包含自定义范围),parallel_pipeline
,flow::graph
等内容在更高级别上表达