Cos*_*gan 2 c++ lambda multithreading tbb c++11
TBB的文档提供了这个例子中使用与parallel_for时lambda表达式,但不提供使用与lambda表达式的例子tbb::task::enqueue.
我正在寻找一个tbb::task::enqueue使用lambda表达式的简单示例.
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) {}
};
Run Code Online (Sandbox Code Playgroud)
然后,您需要创建一个函数模板,它接受一个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) );
}
Run Code Online (Sandbox Code Playgroud)
然后你可以将这个函数用于lambda表达式:
tbb_enqueue_lambda( []{ /* code here */ } );
Run Code Online (Sandbox Code Playgroud)
支持lambda表达式的官方TBB API类,例如task_group和task_arena,在内部使用非常相似的代码.
更新:传递一个函数指针和参数来调用它,上面的方法可以在某些方面扩展:
tbb_enqueue_lambda函数重载std::tuple内部lambda_task,并"解包"函数调用.解包并不是一件容易的事,但是有一些SO主题已经涵盖了:"解包"一个元组来调用匹配的函数指针,如何将元组扩展为可变参数模板函数的参数?, 和别的.