首页 > 解决方案 > TBB:如何获得当前任务竞技场?

问题描述

我有一个小的调度程序观察者类

namespace
{
    class TestObserver : public tbb::task_scheduler_observer
    {
    public:
        TestObserver(tbb::task_arena& a) : tbb::task_scheduler_observer(a)
        {
            observe(true); // activate the observer
        }

        /*override*/ void on_scheduler_entry(bool worker)
        {
            // Do something here
            std::cout << "on_scheduler_entry: " << tbb::task_arena::current_thread_index() << std::endl;
        }

        /*override*/ void on_scheduler_exit(bool worker) 
        { 
            std::cout << "on_scheduler_exit: " << tbb::task_arena::current_thread_index() << std::endl;
        }
    };
}

我想用当前的任务竞技场来初始化它。在我的主代码中,我这样初始化 TBB:

unsigned int numThreads = num_threads;
if (numThreads < 1) numThreads = tbb::task_scheduler_init::automatic;

tbb::task_scheduler_init init(numThreads);

TestObserver obs(...); // <-- fail!

我想用当前的任务竞技场初始化观察者。虽然我没有明确初始化一个,但 TBB 应该会自动完成,对吧?

标签: c++tbb

解决方案


不要使用tbb::task_scheduler_init类;它已被弃用,最终将被删除。如果需要全局限制线程数,请tbb::global_control改用;如果要限制给定作业的并发性,请使用tbb::task_arena. 在后一种情况下,将观察者附加到它也没有问题。

要为当前任务领域创建观察者,请使用tbb::task_scheduler_observer(true). 布尔参数用于将这种“本地”观察者与“全局”观察者区分开来,即不绑定到任何特定领域(“全局”语义是 TBB 观察者的初始语义,它采用默认构造函数)。

您还可以创建一个task_arena附加到当前竞技场的对象,并使用它来初始化您的观察者以及提交作业。为此,请使用特殊参数构造或初始化竞技场:tbb::task_arena(tbb::task_arena::attach()).


推荐阅读