Я хотел бы иметь что-то вроде 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?
В настоящее время у меня есть явный поток, который просто выполняется из очереди, используя переменную условия. Однако проблема с использованием очереди заключается в том, как бы я гарантировал
что только одна задача активна в группе задач.
(Раскрытие информации: я работаю над 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;
}
Других решений пока нет …