You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:22:50