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

时间:2014-08-21 15:57:08

标签: c++ multithreading tbb

我想在一组块上并行执行for循环(使用TBB),其中每个块将使用用户提供的函数进行处理。通常,我会使用tbb::parallel_for()执行此操作。由于各种原因,我希望能够将处理块的线程数限制为规定的数量,称之为j。通常,我会使用tbb::task_scheduler_init(j)执行此操作。

但是,我希望用户可以选择使用TBB,具体来说,让用户提供的功能使用,但是仍有许多内核。所以我认为tbb::task_scheduler_init()已经出局了。我能看到的唯一解决方案是让用户调用tbb::task_scheduler_init()(或一起忽略它),然后在正常的for循环中自行调用jtbb::tbb_thread实例。我错过了什么吗?在TBB中有更自然的方法吗?是否有某种tbb::task_scheduler_init()的分层版本?

1 个答案:

答案 0 :(得分:8)

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

  1. 如您所述,使用tbb::task_scheduler_init创建单独的线程并使用有限并发对其进行初始化。由于主线程是隔离的,因此不会影响主线程和其他线程。因此,您可以从该特殊有限线程内部启动parallel_for。
  2. 使用tbb::parallel_pipeline代替parallel_for并指定令牌数= j,以限制并发处理任务的数量。
  3. 使用tbb::task_arena(TBB 4.3之前的预览功能)执行与(1)中所述相同的操作,但没有额外的主线程,因为可以使用其API将工作放入隔离的并发上下文(竞技场)
  4. (3)的例子:

    tbb::task_arena limited_arena(j);
    limited_arena.execute([]{ tbb::parallel_for(...); });