BOOST::线程工作线程同步,C++和OpenCV



我正在做一个项目,我正在并行化用OpenCV编写的对象跟踪器,使其适应跟踪多个对象。我正在使用 BOOST 库做多线程部分,该库具有非常干净的可移植多线程接口。

我有多个跟踪函数实例在多个线程上运行,根据初始场景中检测到的对象数量生成。每个线程都有自己的工作循环,他逐帧跟踪对象。我的问题是:如何在每次循环迭代中收集结果以便保存它们?线程之间没有通信,但是在每个循环结束时,当帧处理完成时,我希望对每个线程的输出求和,以便我可以大致了解场景以及我正在跟踪的每个对象的结果。

我已经看了一下boost::barrier,这是一个好的开始,但是一旦我设法在循环结束时停止所有线程,我不知道如何收集结果。我需要额外的"收集器"线程吗?几年前,我完成了并行计算的唯一课程,所以我对并行事物有点生疏:)感谢您的任何帮助!

你不需要停止线程。使用一些常见的多线程技术,如互斥体(std::mutexboost::mutex)可以获取这些信息。

您可以保留有关每个正在运行的线程的一些线程信息,例如,一些struct ThreadInfo和一些std::list<ThreadInfo> threads左右,您可以跟踪所有正在运行的线程。

每个ThreadInfo都有自己的互斥锁。你会把你想要的信息放在那里,作为你对场景的一般视图的一部分。在将数据写入结构时,您当然会锁定/解锁互斥锁。如果互斥锁没有被另一个线程获取,则锁定互斥锁非常快(几乎免费),因此大多数时候您不会丢失太多。

然后,在主线程中,您可能处于空闲状态或要显示该信息以供常规视图使用的地方,每隔一秒左右,您将遍历所有threads然后读取该信息(当然,在每次读取之前,您必须锁定/解锁互斥锁)。

最新更新