【发布时间】:2014-07-17 06:45:30
【问题描述】:
抱歉,如果有人问过这个问题,我在问之前已经尽力搜索了一个 dup...
我正在实现一个应该实时运行的视频处理应用程序。它所做的处理可以很容易地分为 4 个阶段,每个阶段都对前一阶段生成的中间值进行操作。处理变得比在 1/30 秒内可以处理的要重,但是如果我可以将此应用程序拆分为 4 个线程并将其转换为管道,则每个阶段所需的时间都会少于此,整个事情将实时运行(使用4 帧延迟,这是完全可以接受的)。
我对多线程编程相当陌生,我遇到的问题是,我找不到在每一帧开始时启动/停止每个线程的机制,所以他们都一起前进,交付一个完成在最后构建每个“周期”。我发现的所有框架/库似乎都担心使用队列和工作线程进行负载平衡,但这不是我在这里需要的。四个线程都可以,假设我可以让它们保持同步。
谁能指出我使用 C++ 的起点吗?
谢谢。
【问题讨论】:
-
您是否在使用线程库(即 boost)?还是普通的 POSIX?
-
可能是
std::condition_variable可以帮助您解决问题。可以基于它构建类似信号量的同步机制(另见this question)。 -
@wbennett,我还没有使用任何东西,完全接受建议。该应用程序现在都在一个线程中运行(GUI 除外)。
-
@πάνταῥεῖ,查看了链接......似乎我可以使用它来工作,但它看起来像一个可怕的黑客......没有像时钟这样的机制吗?处理器的管道如何工作?在每个循环中,所有线程都从同一个地方获取输入,并将它们的输出写入同一个地方? (不用担心比赛条件或数据覆盖,这是完全不同的阶段之间的数据)。
-
您可能需要重新考虑这个问题。如果您有一个依赖于下一个阶段的阶段,那么您的速度只会与最慢的阶段一样快(参见阿姆达尔定律)。也许可以考虑水平划分工作而不是垂直划分以加快每个阶段的速度。特别是如果您有软实时要求。
标签: c++ multithreading video pipeline