【发布时间】:2019-08-05 08:57:56
【问题描述】:
我是在 C++ 中使用多线程的初学者,如果您能给我一些建议,我将不胜感激。
我有一个从视频流中接收前一帧和当前帧的函数(我们称这个函数为readFrames())。该函数的任务是计算运动估计。
调用readFrames() 时的想法是:
- 将前一帧和当前帧存储在缓冲区中。
- 我想计算缓冲区中每对帧之间的运动值,但不会阻塞函数
readFrames(),因为在计算该值时可以接收更多帧。我想我必须编写一个函数computeMotionValue(),每次我想执行它时,创建一个新线程并启动它。这个函数应该返回一些float motionValue。 - 每当任何线程返回的
motionValue超过阈值时,我想 +1 一个公共 int 变量,我们称之为nValidMotion。
我的问题是我不知道在访问motionValue 和nValidMotion 时如何“同步”线程。
你能用一些伪代码向我解释一下我该怎么做吗?
【问题讨论】:
-
你可以有一个接收帧队列和一个线程。如您所述计算运动值,您可以弹出 2 个最后输入的帧值和一个函数,这 2 个通过互斥锁和条件变量同步
-
你可以做
nValidMotionatomic,任何对它的访问都会自动同步。 -
您正在寻找的解决方案是“生产者-消费者”问题的变体:en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem 在您的情况下,生产者线程读取帧并将它们放入处理队列。该队列与消费者线程共享。两个线程都需要一种方法来同步它们对队列的访问,以防止一个线程从另一个线程下面拉出地毯。我的第一个快速搜索出现了这个例子,看起来这将是一个足够好的起点来了解线程:gist.github.com/dpressel/de9ea7603fa3f20b55bf
标签: c++ multithreading