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

Cos*_*gan 2 c++ lambda multithreading tbb c++11

TBB的文档提供了这个例子中使用与parallel_for时lambda表达式,但不提供使用与lambda表达式的例子tbb::task::enqueue.

我正在寻找一个tbb::task::enqueue使用lambda表达式的简单示例.

Ale*_*nov 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) {}
};
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_grouptask_arena,在内部使用非常相似的代码.


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