C++ 一个任务具有固定线程数的TBB,其他任务具有默认线程数

C++ 一个任务具有固定线程数的TBB,其他任务具有默认线程数,c++,multithreading,tbb,C++,Multithreading,Tbb,我想在一组块上并行执行for循环(使用TBB),其中每个块都将使用用户提供的函数进行处理。通常,我会使用tbb::parallel_for()来完成这项工作。出于各种原因,我希望能够将处理块的线程数量限制在规定的数量,称之为j。通常,我会使用tbb::task\u scheduler\u init(j)来实现这一点 但是,我希望用户可以选择使用TBB,特别是让用户提供的函数使用剩余的内核。所以我认为tbb::task\u scheduler\u init()已经过时了。我能看到的唯一解决方案是让

我想在一组块上并行执行for循环(使用TBB),其中每个块都将使用用户提供的函数进行处理。通常,我会使用
tbb::parallel_for()
来完成这项工作。出于各种原因,我希望能够将处理块的线程数量限制在规定的数量,称之为
j
。通常,我会使用
tbb::task\u scheduler\u init(j)
来实现这一点


但是,我希望用户可以选择使用TBB,特别是让用户提供的函数使用剩余的内核。所以我认为
tbb::task\u scheduler\u init()
已经过时了。我能看到的唯一解决方案是让用户调用
tbb::task\u scheduler\u init()
(或者一起忽略它),然后在正常的for循环中自行旋转
tbb::tbb\u线程的
j
实例。我遗漏了什么吗?在TBB中是否有更自然的方法来实现这一点?是否存在某种层次结构版本的
tbb::task\u scheduler\u init()

是的,很少有自然的方法来限制某个算法的并发性,同时保持其余算法不变

  • 如您所述,创建单独的线程并使用
    tbb::task\u scheduler\u init
    为有限的并发性初始化它。由于主线程是隔离的,因此不会影响主线程和其他线程。因此,您可以从该特殊受限线程的内部启动并行_
  • 使用
    tbb::parallel_pipeline
    而不是parallel_for,并指定令牌的数量=j,以限制并发处理任务的数量
  • 使用
    tbb::task_arena
    (在tbb 4.3之前是一个预览功能)执行与(1)中所述相同的操作,但不使用额外的主线程,因为可以仅使用其API将工作放入独立并发上下文(arena)中
  • 第(3)项示例:


    谢谢,安东。这很有帮助。我需要仔细阅读最后两个选项。我会将标题更改为:一个任务的固定线程数TBB,其他任务的默认线程数合理。完成。尽管如此,我猜在我的例子中,“其他”是第一个任务的子任务(并行for循环)。
    tbb::task_arena limited_arena(j);
    limited_arena.execute([]{ tbb::parallel_for(...); });