многопоточность — многопоточный конвейер синхронизированных этапов C ++

Извините, если об этом спросили, я сделал все возможное, чтобы найти дупла, прежде чем спрашивать …

Я реализую приложение для обработки видео, которое должно работать в режиме реального времени. Это обработка может быть легко разделена на 4 этапа, каждый из которых работает с промежуточными значениями, сгенерированными из предыдущего этапа. Обработка стала тяжелее, чем то, что может быть обработано за 1/30-ую секунды, но если я смогу разделить это приложение на 4 потока и превратить его в конвейер, каждый этап занимает меньше, и все это будет выполняться в реальном времени (с 4 кадра задержки, что вполне приемлемо).

Я довольно новичок в многопоточном программировании, и проблема, с которой я столкнулся, заключается в том, что я не могу найти механизм, позволяющий запускать / останавливать каждый поток в начале каждого кадра, поэтому они все идут вместе, доставляя один готовый кадр каждый » цикл «в конце. Все фреймворки / библиотеки, которые я обнаружил, похоже, беспокоятся о балансировке нагрузки с использованием очередей и рабочих потоков, но здесь это не то, что мне нужно. Подойдут четыре потока, если я смогу синхронизировать их.

Кто-нибудь может указать мне на отправную точку, используя C ++?

Благодарю.

0

Решение

Предполагая, что задержка в 4 кадра приемлема, вы можете использовать пул узлов списка, каждый из которых имеет указатель на буфер кадра и указатель на промежуточные значения (указатель NULL может использоваться для указания конца потока). Каждый поток будет иметь свой собственный список как часть многопоточной системы обмена сообщениями. Первый поток получит узел кадра из свободного пула, выполнит его обработку и отправит узел в список следующих потоков, и так далее, а последний поток вернет узлы обратно в свободный пул.

Вот ссылка на пример программы копирования файлов, которая создает поток для записи. Он использует многопоточность, мьютексы и семафоры Windows в функциях обмена сообщениями, но функции обмена сообщениями просты и могут быть изменены внутри системы для использования общих эквивалентов без изменения их интерфейса. Функция main () может быть изменена для использования общего потока и настройки мьютексов и семафоров или чего-то подобного.

mtcopy.zip

0

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


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