我正在做一个项目,我正在并行化用OpenCV编写的对象跟踪器,使其适应跟踪多个对象。我正在使用 BOOST 库做多线程部分,该库具有非常干净的可移植多线程接口。
我有多个跟踪函数实例在多个线程上运行,根据初始场景中检测到的对象数量生成。每个线程都有自己的工作循环,他逐帧跟踪对象。我的问题是:如何在每次循环迭代中收集结果以便保存它们?线程之间没有通信,但是在每个循环结束时,当帧处理完成时,我希望对每个线程的输出求和,以便我可以大致了解场景以及我正在跟踪的每个对象的结果。
我已经看了一下boost::barrier
,这是一个好的开始,但是一旦我设法在循环结束时停止所有线程,我不知道如何收集结果。我需要额外的"收集器"线程吗?几年前,我完成了并行计算的唯一课程,所以我对并行事物有点生疏:)感谢您的任何帮助!
你不需要停止线程。使用一些常见的多线程技术,如互斥体(std::mutex
或boost::mutex
)可以获取这些信息。
您可以保留有关每个正在运行的线程的一些线程信息,例如,一些struct ThreadInfo
和一些std::list<ThreadInfo> threads
左右,您可以跟踪所有正在运行的线程。
每个ThreadInfo
都有自己的互斥锁。你会把你想要的信息放在那里,作为你对场景的一般视图的一部分。在将数据写入结构时,您当然会锁定/解锁互斥锁。如果互斥锁没有被另一个线程获取,则锁定互斥锁非常快(几乎免费),因此大多数时候您不会丢失太多。
然后,在主线程中,您可能处于空闲状态或要显示该信息以供常规视图使用的地方,每隔一秒左右,您将遍历所有threads
然后读取该信息(当然,在每次读取之前,您必须锁定/解锁互斥锁)。