0

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

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

所以合乎逻辑的问题是:是否有可能实现主线程到 arena 组的后期加入并使用它的时钟来帮助完成剩余的工作?任何等效的基于 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();
4

1 回答 1

2

你不能单独做到这一点task_arena,但和的结合task_arenatask_group起作用。你的代码几乎是正确的,除了你需要

  • group.wait()在竞技场内通话;
  • 使用arena.execute()而不是enqueue()这样group.run()肯定会在之前调用group.wait()

这是固定示例(TBB 文档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()方法,但发现它在语义上是模棱两可的(“没有剩余的空闲任务”并不意味着“工作已完成”)并且如果被该领域中已经存在的线程意外调用可能会死锁。task_group由于等待一组特定的任务,而不是等待“所有提交的工作”,与的组合没有这两个缺点。

于 2018-02-25T20:02:38.090 回答