2013-07-18 5 views
2

Я работаю с OpenCV, библиотекой обработки изображений с открытым исходным кодом, и из-за сложностей в моем алгоритме мне нужно использовать несколько потоков для обработки видео.C++ 98 и threading

Как многопоточность выполняется на C++ 98? Я знаю, что в C++ 11 есть встроенная библиотека поддержки для потоковой передачи (std :: thread), но у моей платформы (MSVC++ 2010) этого нет. Также я читал о библиотеке Boost, которая является расширением общего назначения для C++ STL, имеет методы многопоточности. Я также знаю с поддержкой MSDN (windows.h). Я могу создавать и управлять потоками для приложений Windows. Наконец, я узнал, что решение Qt library, кросс-платформенное графическое решение, поддерживает потоковую обработку.

Есть ли наивный способ (не имея сторонних библиотек) для создания кросс-платформенного многопоточного приложения?

ответ

4

OpenCV опирается на различные внешние системы для многопоточности (или, точнее, параллельной обработки). Возможные варианты:

  • OpenMP (обрабатываются на уровне компилятора);
  • Intel's TBB (внешняя библиотека);
  • libdispatch (в системах, которые поддерживают его, например, MacOS, iOS, * BSD);
  • GPGPU подходит к CUDA и OpenCL.

В последних версиях OpenCV эти системы «скрыты» за конструкцией parallel_for.

Все это относится к параллельной обработке, то есть параллельным задачам данных (грубо говоря, обрабатывать каждый пиксель или строку входа параллельно). Если вам требуется многопоточность на уровне приложений (например, с использованием основного потока и рабочих), вам необходимо использовать фреймворки, такие как потоки POSIX или Qt.

+0

У меня самая последняя версия 2.4.6, благодаря которой я только что узнал о том, что opencv имеет поддержку нисходящего потока. Однако, подобно потоку с C#, мне нужна операция более высокого уровня. Например, один поток должен постоянно загружать кадры из видео, другой цикл должен вызывать функцию обработки, вводящую кадр. – baci

+1

Тогда, действительно, то, что вы ищете, вероятно, зависит от платформы, потому что оно каким-то образом связано с временем выполнения ваше приложение. По-видимому, потоки POSIX, Boost или Qt должны делать правильную работу. Но вы не можете избежать введения внешних зависимостей и одновременно быть межплатформенными. – sansuiso

7

C++ 98 не поддерживает потоковую обработку ни на языке, ни в стандартной библиотеке. Вам нужно использовать стороннюю библиотеку, и вы уже указали ряд основных кандидатов.

2

Я рекомендую boost::thread который (в основном) совместим с std::thread в C++ 11. Это кросс-платформенный и очень зрелый.
Параллелизм OpenCV является внутренним и не смешивается напрямую с вашим кодом, но он может использовать больше ресурсов и ядер, чем вы могли бы ожидать (как функция), но это может быть связано с другими внешними процессами.