2011-11-28 100 views
4

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

TBB任务调度程序是否适合这种行为?我从任务调度程序得到的印象是,如果我有可以被分解并且彼此并行执行的任务,那么这将是有益的。

+2

从http://threadingbuildingblocks.org/documentation.php下载“设计模式”指南。它特别提到了从GUI线程中卸载长时间运行的任务(参见第8章“GUI线程”),并且有一个简单的例子来说明它是如何完成的。 –

回答

8

从版本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)。