gpt4 book ai didi

c++ - C++ 中的多线程池

转载 作者:行者123 更新时间:2023-11-28 01:19:06 25 4
gpt4 key购买 nike

我正在开发一个程序,它不断地从视频流中接收帧并计算每对帧之间的运动估计值。

由于硬件限制,我必须在 CPU 中计算运动估计 (ME) 算法,每次计算大约需要 2 秒。因此,我想用多线程实现 ME 算法。这个想法是在主线程中从流中接收下一帧,同时在其他线程中计算运动值。

我已经为每个任务使用一个线程来完成它,也就是说,每次收到一对帧时,我都会创建一个新线程来计算运动值。但是,由于Motion Computation的时间流逝,很多线程被创建并同时运行,我认为效率不是很高。

我认为重新实现它的最佳方法是使用线程池。例如,一方面有一个主线程接收帧并将它们存储在缓冲区或队列中,另一方面有 4 或 8 个线程并发运行并从接收缓冲区读取,如果我没记错的话应该受到保护通过互斥锁。但是,主线程接收帧的速度比一个运动计算结束快得多,我不知道如何管理它。

我是 C++ 和线程的新手,所以如果您能提供一些伪代码解决方案以开始我的重新实现,我将不胜感激。

非常感谢

最佳答案

在这种情况下,我会避免使用线程池。来自 wikipedia (强调我的):

[A thread pool] increases performance and avoids latency in execution due to frequent creation and destruction of threads for short-lived tasks.

您长时间运行的计算使创建和销毁线程所需的时间相形见绌,因此对我来说为每个任务创建一个线程似乎是合理的。越多地避免互斥锁和 co.,就越好。至于一次运行很多线程,线程之间切换所需的时间与计算时间相比也相形见绌,因此限制使用的线程数只会给你带来非常小的加速比1

如果您的机器无法足够快地完成计算以跟上传入数据,您可能会遇到问题。如果您的所有 CPU 内核都以 100% 的速度运行,您唯一能做的就是提高计算效率(也许对视频帧进行下采样?)或获得更多计算能力。


They are incoming frames in real-time at 30fps.

1 我应该注意,对于实时应用程序,您应该将使用的线程数限制为内核数(或一两个更高的内核数,对其进行分析) .这将减少接收帧和生成结果之间的延迟,而不会影响整体性能。

关于c++ - C++ 中的多线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57413263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com