c++ - 使用 lambda 的线程构建 block (TBB) 排队任务

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

TBB 文档给出了 this example将 lambda 表达式与 parallel_for 结合使用,但未提供将 lambda 表达式与 tbb::task::enqueue 结合使用的示例。

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

最佳答案

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) {}
};

然后,您需要创建一个函数模板,它接受一个仿函数/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,在内部使用非常相似的代码。


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

关于c++ - 使用 lambda 的线程构建 block (TBB) 排队任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22345935/

相关文章:

c++ - 通过非模板化基类的模板化多态性

c++类方法回调类似于std::thread

c++ - Xcode 错误 : Undefined symbols for architecture x86_44 & ld: symbol(s) not found for architecture x86_64

c# - 需要帮助跨 UI 线程和 C# 中的另一个线程获取信息

c# - Task.WhenAll - 何时使用它

c++ - 非返回 lambda,捕获作为函数指针

c++ - 抵御 C++ 继承陷阱的设计技巧

java - 在 main 中创建数组并用来自单独线程的数据填充它

c++ - 编写宏

Eclipse Indexer 中的 C++11 设置与 git 冲突