2014-07-16 3 views
0

Извините, если это было предложено, я сделал все возможное, чтобы искать DUP, прежде чем спрашивать ...C++ синхронизированные этапы мульти нить трубопровода

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

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

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

Спасибо.

+0

Вы используете потоковую библиотеку (т.е. повысить)? Или ванильный POSIX? – wbennett

+0

Может быть, ['std :: condition_variable'] (http://en.cppreference.com/w/cpp/thread/condition_variable) может помочь вашему делу. На нем можно построить семафор, например, механизм синхронизации (см. [Этот вопрос] (http://stackoverflow.com/questions/3513045/conditional-variable-vs-semaphore)). –

+0

@wbennett, я еще ничего не использую, полностью открыт для предложений. Приложение все работает в одном потоке прямо сейчас (за исключением GUI). – user3846684

ответ

0

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

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

mtcopy.zip

+0

Спасибо за предложение и исходный код, очень полезно. Тем не менее, я пытался избежать обмена пулами/очередями между потоками, потому что я не думаю, что это соответствует характеру моего алгоритма. Нити никогда не будут «обойти» друг друга, все они выполняют свою работу в промежутке между кадрами, поступающими из источника видео. Мне просто нужен механизм, чтобы рассказать обо всех потоках одновременно, когда начинать работу над новым фреймом (каждый на своей собственной части конвейера обработки). Если это имеет смысл ... – user3846684

+0

Компромисс - несколько неудобная последовательность запуска, поскольку это поэтапный процесс (на основе вашего сообщения, что каждый поток использует промежуточные значения, полученные из другого потока). Второй поток не имеет ничего общего, пока первый поток не завершит первый кадр. Четвертому потоку нечего делать, пока третий поток не завершит первый кадр. Использование системы обмена сообщениями упрощает запуск, и если вы посмотрите на примерный код, фактические функции обмена сообщениями малы. – rcgldr

+0

Альтернативой обмену сообщениями будет использование переменной события или условия для запуска каждого потока. – rcgldr

Смежные вопросы