线程构建块(TBB)使用lambda排队任务

时间:2014-03-12 08:34:06

标签: c++ multithreading c++11 lambda tbb

TBB文档为this example提供了使用parallel_for的lambda表达式,但没有提供使用tbb::task::enqueue的lambda表达式的示例。

我正在寻找一个带有lambda表达式的tbb::task::enqueue的简单示例。

1 个答案:

答案 0 :(得分:5)

TBB中的低级任务不直接支持lambda表达式。但是通过一些额外的编码,您可以创建语法 - 糖助手来做你想要的。

您需要创建一个调用给定仿函数的任务类:

template<typename F>
class lambda_task : public tbb::task {
    F my_func;
    /*override*/ tbb::task* execute() {
        my_func();
        return NULL;
    }
public:
    lambda_task( const F& f ) : my_func(f) {}
};

然后,你需要创建一个函数模板,它接受一个functor / lambda,将它包装到lambda_task中,然后排队:

template<typename F>
void tbb_enqueue_lambda( const F& f ) {
    tbb::task::enqueue( *new( tbb::task::allocate_root() ) lambda_task<F>(f) );
}

然后你可以将这个函数用于lambda表达式:

tbb_enqueue_lambda( []{ /* code here */ } );

支持lambda表达式的官方TBB API类,例如task_grouptask_arena,在内部使用非常相似的代码。


更新:要传递一个函数指针和参数来调用它,上面的方法可以通过某种方式扩展: