【问题标题】:C++ 98 and threadingC++ 98 和线程
【发布时间】:2013-07-18 10:42:12
【问题描述】:

我正在使用开源图像处理库 OpenCV,由于我的算法复杂,我需要使用多个线程进行视频处理。

如何在 C++ 98 上完成多线程?我知道 C++ 11 有一个内置的线程支持库(std::thread),但我的平台(MSVC++ 2010)没有。我还阅读了 Boost 库,它是 C++ STL 的通用扩展,具有多线程方法。我还知道通过 MSDN 支持 (windows.h) 我可以为 Windows 应用程序创建和管理线程。最后发现Qt library这个跨平台的GUI解决方案支持线程。

是否有一种简单的方法(没有任何 3rd 方库)来创建跨平台多线程应用程序?

【问题讨论】:

    标签: multithreading opencv c++98


    【解决方案1】:

    C++98 在语言和标准库中都不支持线程。您需要使用第三方库,并且您已经列出了一些主要的候选者。

    【讨论】:

      【解决方案2】:

      OpenCV 依赖于不同的外部系统进行多线程(或更准确地说是并行处理)。 可能的选项是:

      • OpenMP(在编译器级别处理);
      • Intel's TBB(外部库);
      • libdispatch(在支持它的系统上,如 MacOS、iOS、*BSD);
      • 使用 CUDA 和 OpenCL 的 GPGPU 方法。

      在最新版本的 OpenCV 中,这些系统“隐藏”在 parallel_for 构造之后。

      所有这些都适用于并行处理,即数据并行任务(粗略地说,并行处理输入的每个像素或行)。如果您需要应用程序级别的多线程(例如拥有主线程和工作线程),那么您需要使用诸如 POSIX 线程或 Qt 之类的框架。

      【讨论】:

      • 我有最新的 2.4.6 版本,感谢你我刚刚了解到 opencv 具有低级线程支持。但是,与 C# 线程类似,我需要更高级别的操作。例如,一个线程应该不断地从视频中加载帧,另一个循环应该调用一个输入帧的处理函数..
      • 那么确实,您正在寻找的内容很可能与平台相关,因为它以某种方式与您的应用程序的运行时相关联。我猜 POSIX、Boost 或 Qt 线程应该为你做正确的工作。但是你不能真正避免引入外部依赖并同时跨平台。
      【解决方案3】:

      我推荐boost::thread,它(大部分)与 C++11 中的std::thread 兼容。它是跨平台的,非常成熟。
      OpenCV 的并行性是内部的,不会直接与您的代码混合,但它可能会使用比您预期的更多的资源和内核(作为一项功能),但这可能会以牺牲其他外部进程为代价。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-10
        相关资源
        最近更新 更多