2011-11-28 101 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)。