В порядке исполнения с TBB?

Я хотел бы иметь что-то вроде tbb::task_group но с гарантированной разницей в исполнении заказа, например

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?

В настоящее время у меня есть явный поток, который просто выполняется из очереди, используя переменную условия. Однако проблема с использованием очереди заключается в том, как бы я гарантировал
что только одна задача активна в группе задач.

3

Решение

(Раскрытие информации: я работаю над Intel Threading Building Blocks в Intel.)

Как было предложено в другом ответе, вы можете использовать потоковый график, чтобы сделать что-то вроде этого. Код для вашего примера с использованием потокового графа будет выглядеть примерно так:

#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;
}
7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]