TBB文档为this example提供了使用parallel_for的lambda表达式,但没有提供使用tbb::task::enqueue
的lambda表达式的示例。
我正在寻找一个带有lambda表达式的tbb::task::enqueue
的简单示例。
答案 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_group
和task_arena
,在内部使用非常相似的代码。
更新:要传递一个函数指针和参数来调用它,上面的方法可以通过某种方式扩展:
tbb_enqueue_lambda
函数的相应重载std::tuple
lambda_task
内,并“解包”函数调用。解压缩并非易事,但已经有一些SO主题涵盖了这些主题:"unpacking" a tuple to call a matching function pointer,How do I expand a tuple into variadic template function's arguments?和其他。