Есть ли что-то похожее на продолжение задач PPL в TBB? Мне известен низкоуровневый метод TBB для ручного выделения tbb::task
s, а также ручного выделения задач продолжения и ручного управления счетчиками ссылок для них:
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?
then
, думаю с 1.53 возможно не все методы реализованы, а в других могут быть какие-то баги. Проверьте документы. У TBB нет ничего подобного, одна вещь, которая близка, - это блок-схема TBB. Вы можете создать схему потока для ваших сообщений, TBB будет распараллеливать везде, где это возможно. Хотя это не так просто, какthen
, оно также намного мощнее. Наконец, я хочу упомянуть, что TBB ориентирован не на параллелизм на основе задач, а на шаблоны алгоритмов, которые абстрагируют проблемы, связанные с параллельными данными. - person Stephan Dollberg   schedule 15.04.2013