以后主线程可以加入TBB竞技场组吗?

时间:2018-02-23 15:31:38

标签: multithreading tbb tbb-flow-graph

比如说,有一个主线程部署TBB以产生额外的工作线程,如下面的代码片段所示。

主线程继续其业务,无需等待竞技场组完成。但是,主线程可能恰好在工作线程之前完成。

所以逻辑问题是:是否可以实现主线程的后期连接到竞技场组并使用其时钟来帮助完成剩余的工作?任何基于TBB的等效解决方案都可以实现这种情况吗?

tbb::task_group group;
tbb::task_arena arena(nthreads, 1);

tbb::task_scheduler_init init(nthreads);

arena.enqueue( [&]
{
    group.run( [&]
    {
        ...
    });
});

// Work done on master thread here

// Master thread has finished: can it now join the arena group
// and help with the remaining work?

group.wait();

1 个答案:

答案 0 :(得分:1)

单独使用task_arena您无法做到这一点,但task_arenatask_group的组合将起作用。你的代码几乎是正确的,除了你需要

  • 在竞技场内呼叫group.wait();
  • 使用arena.execute()代替enqueue(),以便在group.run()之前确定调用group.wait()

以下是固定样本(TBB documentation for task_arena有类似的样本):

tbb::task_group group;
tbb::task_arena arena(nthreads, 1);

tbb::task_scheduler_init init(nthreads);

arena.execute( [&]
{
    group.run( [&]
    {
        ...
    });
});

// Work done on master thread here

// Master thread has finished; now it joins the arena group
// and helps with the remaining work
arena.execute( [&]
{
    group.wait();
});

它可能看起来有些过于复杂,但如果你认为task_arena是工人的抽象,而不是工作,那就开始有意义了。我们想添加一个task_arena::wait()方法,但发现它在语义上是模棱两可的("没有剩余的任务和#34;并不意味着"工作完成")并且可能会死锁如果已经在该舞台上的线程意外调用。与task_group的组合由于等待特定的一组任务而没有这两个缺点,而不是“所有提交的工作”#34;