2012-12-16 34 views
3

我想有一個像tbb::task_group東西,但與有序的執行保證的差異,例如爲了執行TBB?

serial_task_group tasks; 

tasks.run([]{std::cout << 1;}); 
tasks.run([]{std::cout << 2;}); 
tasks.run([]{std::cout << 3;}); 
tasks.wait(); 

// guaranteed output: 123 

有關如何使用tbb可以實現此目的的任何建議?

目前我有一個顯式的線程,只是使用條件變量從隊列執行。但是,使用隊列的問題是我如何去保證 只有一個任務在task_group中處於活動狀態。

+0

我真的不能看到你想要實現什麼。如果我的理解正確,你只需要按順序執行任務,而且一次只執行一個任務。但在這種情況下,我沒有看到你需要'task_group'。如果你沒有併發執行,你可以直接在調用線程/函數中做任何你需要的事情,而不是委託給一個「任務」結構。關於你的問題的最後部分:如果你只有一個執行任務的線程,那麼一個任務會多活動一次? – Grizzly

+0

@Grizzly:我有很多其他併發的東西在繼續。但是,我想在這裏運行的特定計算需要按順序運行,並且非常重。如果我使用顯式線程而不是使用任務調度程序,則由於超額訂閱,我有相當的開銷。我的目標是在任務調度器中運行一切。 – ronag

+1

你看過tbb流程圖嗎?在windows上,代理程序庫很容易實現,在tbb流程圖中是最接近的等價物。 – Rick

回答

7

(披露:我在英特爾的英特爾線程構建模塊工作)

正如在另一個答案建議,您可以使用流圖做這樣的事情。你使用流程圖的例子的代碼看起來像這樣:

#include "tbb/flow_graph.h" 
#include <iostream> 

using namespace tbb::flow; 

int main(int argc, char *argv[]) { 
    graph g; 
    continue_node<continue_msg> n1(g, [](const continue_msg &) { std::cout << "1"; }); 
    continue_node<continue_msg> n2(g, [](const continue_msg &) { std::cout << "2"; }); 
    continue_node<continue_msg> n3(g, [](const continue_msg &) { std::cout << "3"; }); 
    make_edge(n1, n2); 
    make_edge(n2, n3); 
    n1.try_put(continue_msg()); 
    g.wait_for_all(); 
    return 0; 
} 
+1

不是我想要的,但根據您發佈的內容,也許這是http://pastebin.com/i2rxGKsP? – ronag

+1

是的這應該工作。由於節點是串行的,它將按順序接收並執行這些功能,而不會重疊執行。他們將被安排爲TBB任務,因此可以與系統中的任何其他TBB任務同時執行。 –

+0

必須有一個更簡單的方法,而不必爲每個要並行執行的任務創建一個對象 - 這可能不可行或完全沒有必要。 – 2013-08-30 00:32:15