使用TBB进行非并行任务
问题描述:
我想使用TBB获得线程池行为。但是每当我阅读有关TBB的文档时,他们总是会谈论并行 - 并行 - dowhile等。相比之下,我需要的是一个主线程来将任务分配给线程池,以便这些任务将“独立执行” - 执行任务异步。这里的任务可以是GUI的事件处理。使用TBB进行非并行任务
TBB任务调度程序是否适合这种行为?我从任务调度程序得到的印象是,如果我有可以被分解并且彼此并行执行的任务,那么这将是有益的。
答
从版本3.0开始,TBB支持异步执行任务。为此,增加了一种特殊的工作提供方法tbb::task::enqueue()
。与tbb::task::spawn()
不同,此方法保证即使原始线程永不输入任务分派方法(如wait_for_all()
),也会执行入队任务。
为task::enqueue()
简短的用法例如:
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
由于@JimMishell的评论,一个如何使用它的GUI事件的处理可以在“设计模式”中找到提到的;并且该方法的正式说明可在参考手册中找到(参见TBB documentation)。
从http://threadingbuildingblocks.org/documentation.php下载“设计模式”指南。它特别提到了从GUI线程中卸载长时间运行的任务(参见第8章“GUI线程”),并且有一个简单的例子来说明它是如何完成的。 –