Использование модели конвейера

В модели конве йера поток входных данных обрабатывается поэтапно. На каждом этапе некоторая порция работы (часть входного потока данных) обрабатывается одним потоком выполнения, а затем передается для обработки следующему. Каждая порция входных данных переходит на очередной этап обработки до тех пор, пока не будет завершена вся обработка. Такой подход позволяет обрабатывать несколько входных потоков данных одновременно. Каждый поток выполнения отвечает за достижение пром ежуточного результата, делая его доступным для следующего этапа (т.е. следующего потока конвейера). Скелет программы реализации модели конвейера представлен в листинге 4.9.

// Листинг 4.9. Скелет программы реализации модели конвейера

//...

pthread_t Thread[N]

Queues[N]

// initial thread

{

place all input into stage1's queue

pthread_create(&(Thread[1]...stage1...);

pthread_create(&(Thread[2]...stage2...);

pthread_create(&(Thread[3]...stage3...);

//...

}

void *stageX(void *X)

{

loop

suspend until input unit is in queue

loop while XQueue is not empty

dequeue input unit

process input unit

enqueue input unit into next stage's queue

end loop

until done

return(NULL)

}

В листинге 4.9 объявляется N очередей для N этапов. Начальный поток помещает все порции входных потоков в очередь первого этапа, а затем создает все потоки, необходимые для выполнения всех этапов. Каждый этап содержит свой цикл событий. Поток выполнения находится в состоянии ожидания до тех пор, пока в его очереди не появится порция входных данных. Внутренний цикл продолжается до опустения соответствующей очереди. Порция входных данных извлекается из очереди, обрабатывается, а затем помещается в очередь следующего этапа обработки (следующего потока выполнения).

Больше книг — больше знаний!

Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом

ПОЛУЧИТЬ СКИДКУ