如何在tbb::parallel_for的仿函数中引用传入的tbb::task_group_context实例?
问题:如何在TBB的parallel_for中引用传入的task_group_context实例?
我写了如下代码:
tbb::task_group_context tg; SomeClass someObject; tbb::parallel_for(tbb::blocked_range<size_t>(0, num, grainSize), someObject, tbb::simple_partitioner(), tg);
class SomeClass { void operator()(const tbb::blocked_range<size_t>& r) const { tg.cancel_group_execution(); //how do i refer to object tg ? }
编译时出现错误:"tg" not declared in this scope,请问如何正确引用通过tbb::parallel_for传入的tbb::task_group_context实例tg?
解决方法
方法一:给仿函数添加成员变量存储上下文引用
修改SomeClass,添加一个引用类型的成员变量保存task_group_context实例,在构造时传入tg:
class SomeClass { private: tbb::task_group_context& m_tg; // 存储上下文引用 public: // 构造函数接收上下文引用并初始化成员 SomeClass(tbb::task_group_context& tg) : m_tg(tg) {} void operator()(const tbb::blocked_range<size_t>& r) const { m_tg.cancel_group_execution(); // 通过成员变量访问上下文 } };
创建SomeClass实例时传入tg:
tbb::task_group_context tg; SomeClass someObject(tg); // 传入上下文实例 tbb::parallel_for(tbb::blocked_range<size_t>(0, num, grainSize), someObject, tbb::simple_partitioner(), tg);
方法二:使用Lambda表达式替代自定义仿函数
如果不需要复用SomeClass,直接用Lambda表达式捕获tg会更简洁:
tbb::task_group_context tg; tbb::parallel_for(tbb::blocked_range<size_t>(0, num, grainSize), [&tg](const tbb::blocked_range<size_t>& r) { tg.cancel_group_execution(); // 直接捕获外部的tg }, tbb::simple_partitioner(), tg);
内容的提问来源于stack exchange,提问作者user6042013
相关产品推荐
相关产品推荐

