【发布时间】:2019-08-08 13:00:47
【问题描述】:
我正在开发一个程序,它不断地从视频流中接收帧并计算每对帧之间的运动估计值。
由于硬件限制,我必须在 CPU 中计算运动估计 (ME) 算法,每次计算大约需要 2 秒。正因为如此,我想用多线程来实现 ME 算法。想法是在主线程中从流中接收下一帧,同时在其他线程中计算运动值。
我已经为每个任务使用一个线程来完成它,也就是说,每次收到一对帧时,我都会创建一个新线程来计算运动值。但是,由于运动计算的时间过长,会创建很多线程并同时运行,我认为这不是很有效。
我认为重新实现这一点的最佳方法是使用线程池。例如,一方面有一个主线程接收帧并将它们存储在缓冲区或队列中,另一方面有 4 或 8 个线程同时运行并从接收缓冲区读取,如果我没记错的话应该受到保护通过互斥锁。但是,主线程接收帧的速度比一个运动计算结束要快得多,我不知道如何管理。
我对 C++ 和线程非常陌生,所以如果您能提供一些伪代码解决方案来开始我的重新实现,我将不胜感激。
非常感谢
【问题讨论】:
-
嗯,正如你所说,你可以使用互斥锁!所以每次创建线程时,锁定互斥锁,增加 ThreadCounter。然后解锁互斥锁。仅当计数器小于最大数时才创建互斥锁...
-
你的跳帧策略是什么?如果你只是盲目地开始处理进来的前几帧,你最终会陷入一种只覆盖每秒前 16 帧的节奏,而不是每秒均匀采样。
-
您输入的帧是实时的,还是从文件中解码的?如果它们是实时的,那么您确实会落后于两秒钟的计算,并且需要一些方法来应对。如果它们来自文件,您可以在队列已满时停止读取,并等到您赶上。
-
@Useless 它们是以 30 fps 的速度实时传入的帧,但我们确实不会处理所有这些帧,我们的想法是获得大约 5-6 fps。感谢您的回答
-
好的,所以您预计需要大约 10-12 个线程来每秒产生 5-6 帧。你有那么多免费核心吗?
标签: c++ multithreading pool