c++ - 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 应该会自动完成,对吧?
解决方案
不要使用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())
.
推荐阅读
- java - Maven Eclipse 插件错误?无法自动添加工作区依赖 JAR 到运行配置模块路径
- php - 如何在 WordPress realia 插件中使用 recaptcha
- javascript - 保护 HTML 中敏感信息复制的最佳方法?
- python - 在 Heroku 上的 clock.py 中使用 APScheduler 从主应用程序调用 def send_email_reminder
- excel - 模拟鼠标点击从IE浏览器下载文件
- javascript - POST request with nested Map empty
- javascript - React Native Flatlist - 如何循环嵌套对象
- google-cloud-functions - 尝试在 Stripe 中更新信用卡可选详细信息时收到未知参数
- r - R中箱线图后面的网格
- linux - 在 Bash shell 脚本中找不到命令错误