Asynchronous 对非并行任务使用TBB

Asynchronous 对非并行任务使用TBB,asynchronous,threadpool,tbb,Asynchronous,Threadpool,Tbb,我想使用TBB获得线程池行为。但每当我阅读关于TBB的文档时,他们总是谈论并行for、并行dowhile等。相比之下,我需要的是一个主线程将任务分配给线程池,以便这些任务将“独立”执行——异步执行任务。这里的任务可以是GUI的事件处理 TBB任务调度器是否适合这种行为?我从task scheduler得到的印象是,只有当我有可以分解并并行执行的任务时,它才是有益的。从3.0版开始,TBB支持异步执行任务。为此,添加了一个特殊的工作提供方法tbb::task::enqueue()。与tbb::ta

我想使用TBB获得线程池行为。但每当我阅读关于TBB的文档时,他们总是谈论并行for、并行dowhile等。相比之下,我需要的是一个主线程将任务分配给线程池,以便这些任务将“独立”执行——异步执行任务。这里的任务可以是GUI的事件处理


TBB任务调度器是否适合这种行为?我从task scheduler得到的印象是,只有当我有可以分解并并行执行的任务时,它才是有益的。

从3.0版开始,TBB支持异步执行任务。为此,添加了一个特殊的工作提供方法
tbb::task::enqueue()
。与
tbb::task::spawn()
不同,此方法保证即使原始线程从未进入任务分派方法(如
wait_for_all()
),也会执行排队的任务

task::enqueue()
的简短用法示例:

正如注释中提到的@JimMishell,可以在“设计模式”中找到如何使用它处理GUI事件的示例;参考手册中提供了该方法的正式描述(请参见这两个部分)。

从下载“设计模式”指南。它特别提到了从GUI线程卸载长时间运行的任务(参见第8章“GUI线程”),并有一个简单的示例演示了如何完成。
class MyTask : public tbb::task {
    /*override*/ tbb::task* execute() {
        // Do the job
        return NULL; // or a pointer to a new task to be executed immediately
    }
};

MyTask* t = new (tbb::task::allocate_root()) MyTask();
tbb::task::enqueue(*t);
// Do other job; the task will be executed asynchronously