У меня есть 5 независимых компонентов A, B, C, D, E, где A и B производят данные, C и D обрабатывают обе данные из A и B, E будет визуализировать результаты C и D.Распараллеливание задач и синхронизация данных в конвейере
самый простой способ реализации этого трубопровода будет поместить их все в одном потоке:
while (keep_running)
A->B->C->D->E
Но C и D может быть параллельно, чтобы быть более эффективным. И так могут быть компоненты A и B.
while (keep_running)
{A && B could be in parallel} -> {C && D in parallel} -> E
Интересно, какой эффективный способ реализовать это.
Спасибо!
Обновление: Извините за непонимание.
Позвольте мне только сформулировать мой вопрос в порядке псевдокодов.
// keep_running is just a bool, could be updated to terminate the loop
while (keep_running)
run A; // produce data
run B; // produce data
run C; // processing data from A and B
run D; // processing data from A and B
run E; // visualize results from B and C
while (keep_running)
create_thread ta to run A;
create thread tb to run B;
ta.run();
tb.run();
join ta and tb;
create thread tc to C;
create thread td for D;
tc.run();
td.run();
join tc and td;
run E;
destroy ta,tb,tc,td;
// I think above implementation is not efficient, because create and destroy threads every time
// I wonder if there're some efficient implementation like:
create thread ta,tb,tc,td;
while (keep_running)
ta.run_once();
tb.run_once();
wait ta and tb; // A and B finish a round and go to sleep.
tc.run_once();
td.run_once();
wait tc and td;
run E;
destroy ta, tb, tc, td
// Or other more efficient way ?
У меня нет большого опыта работы в резьбе, извиниться за неясный вопрос, и надеюсь, что кто-то может дать мне несколько советов, которые я мог бы понять это.
Спасибо.
Пожалуйста, выберите * один * либо C или C++. – MikeCAT
@MikeCAT Почему? Я мог бы принимать ответы на C или C++. – blackball
Это только я, или вопрос совершенно неясен без контекста? –