有沒有類似於PPL在TBB中的任務延續? 我知道手冊冊分配tbb::task
S的水平低TBB方法和手動分配也延續任務和手動管理裁判計數他們:英特爾TBB中的任務繼續TBB
struct FibContinuation: public task {
long* const sum;
long x, y;
FibContinuation(long* sum_) : sum(sum_) {}
task* execute() {
*sum = x+y;
return NULL;
}
};
struct FibTask: public task {
const long n;
long* const sum;
FibTask(long n_, long* sum_) :
n(n_), sum(sum_)
{}
task* execute() {
if(n<CutOff) {
*sum = SerialFib(n);
return NULL;
} else {
// long x, y; This line removed
FibContinuation& c =
*new(allocate_continuation()) FibContinuation(sum);
FibTask& a = *new(c.allocate_child()) FibTask(n-2,&c.x);
FibTask& b = *new(c.allocate_child()) FibTask(n-1,&c.y);
// Set ref_count to "two children plus one for the wait".
c.set_ref_count(2);
spawn(b);
spawn(a);
// *sum = x+y; This line removed
return NULL;
}
}
};
這簡直太可怕了。 您必須事先知道您將產卵多少個孩子,並手動設置參考計數。這是很脆弱的編碼...
PPL的規定延續的方式就是這麼簡單:
create_task([]()->bool
{
// compute something then return a bool result
return true
}).then([](bool aComputedResult)
{
// do something with aComputedResult
});
你如何做到這一點的TBB?
只是一些隨機的想法。提升期貨有'然後',我認爲自1.53以來,可能不是所有的方法都實現了,而其他方法可能有一些錯誤。檢查文檔。 TBB沒有類似的東西,接近的就是TBB流程圖。您可以爲您的消息創建流程方案,TBB將盡可能並行化。雖然這不像'then'那麼簡單,但它也更強大。最後,我想提到的是,TBB並不關注基於任務的並行性,而是關注將數據並行問題提取出來的算法模式。 – inf
@bamboon嗯,我會給一個想法,謝謝你回答 –
問題是比較兩種不同語言方言的實現,並抱怨一個而不是其他問題的具體問題的脆弱性。 TBB例子可以循環兩次新的增量產卵,現在脆弱性消失了。可能還有更高效的spawn_all()或者其他東西! – mabraham