2016-02-24 2 views
-3

У меня есть 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 ? 

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

Спасибо.

+4

Пожалуйста, выберите * один * либо C или C++. – MikeCAT

+0

@MikeCAT Почему? Я мог бы принимать ответы на C или C++. – blackball

+0

Это только я, или вопрос совершенно неясен без контекста? –

ответ

0

Создайте два потока для A и B, поместите за ними барьер, чтобы вы не столкнулись с конфликтом. Создать две нити для C & & D, процесс, поставить барьер Закончите E. L