TBB线程池意外增加

TBB thread pool unexpectedly increasing

本文关键字:增加 意外 线程 TBB      更新时间:2023-10-16

我们有一段代码,利用TBB生成任务来执行一些处理,这是使用以下TBB代码初始化TBB线程池来完成的:

tbb::task_scheduler_init(8);
然后,对于我们想要生成的每个任务,我们使用以下代码(其中MainTask派生自tbb::task类):
task = new (tbb::task::allocate_root()) MainTask(theAction, theOutputData);
tbb::task::enqueue(*task);

当我们运行代码时,我们开始时的线程池与预期的内核数量(在我们的示例中为8个线程)相同,但是随着程序的执行和生成新的TBB任务,如上所述,在一些随机点上的线程数量突然增加。程序执行40分钟后,线程数从8增加到15。

为什么会发生这种情况?TBB不应该将工作线程的数量固定为等于内核的数量吗?

正如我在另一个回答中对你说的:别担心:-)

TBB在防止实际的过度订阅方面做得很好-同时只有8个线程将在您的程序中处于活动状态。尽管由于各种原因,它有时需要比硬件资源更多的线程。一个例子是没有保留主槽的tbb::task_arena,另一个最近增加的是tbb::global_control类,它允许动态更改池中活动线程的数量。不幸的是,TBB实现它的方式为数据竞争留下了一些空间。当一些线程在返回线程池的路上获得一些睡眠时,当一个新工作到达并请求所有8个线程立即开始处理时,就会发生这种情况;但是这些处于中间状态的线程还没有被计算在线程池中,而是创建了新的线程。

TBB尽可能地减少了这个数据竞争的窗口,但是要完全关闭它,需要在热路径上进行同步,这将影响总体性能。因此,我们决定允许数据竞争,并在热路径上设置更少的障碍。

但是,不要担心,没有资源泄漏,因为TBB对这种方式可以创建的最大线程数量有硬限制。根据不同的平台,这个数字从2倍到4倍不等(尽管它的内部实现细节在不断变化)。

虽然,我很惊讶,它走了这么远的15线程创建,我理解你的担忧。如果你与TBB团队分享一个复制器,他们会很感激的。您可以通过TBB论坛或OSS网站提供复制器。