BOOST ::线程工作者同步,C ++& OpenCV的

时间:2013-10-17 08:31:23

标签: c++ multithreading opencv boost

我正在开发一个项目,我正在并行化一个用OpenCV编写的对象跟踪器,使其适应跟踪多个对象。 我正在使用BOOST库进行多线程部分,BOOST库具有非常干净的便携式多线程接口。

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

我已经看了boost::barrier,这是一个好的开始,但是一旦我设法在循环结束时停止所有线程,我就不知道如何收集结果。我需要一个额外的“收集者”线程吗?几年前我在并行计算方面做了我唯一的课程,所以我在平行的事情上有点生疏:)感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您无需停止线程。使用一些常见的多线程技术(如互斥锁(std::mutexboost::mutex)可以获取该信息。

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

每个ThreadInfo都有自己的互斥锁。并且您可以将信息放在那里,作为场景的一般视图的一部分。在将数据写入结构体时,您当然会锁定/解锁互斥锁。如果没有被另一个线程获取,那么锁定互斥锁的速度非常快(几乎是免费的),所以你不会在大部分时间内松动。

然后,在主线程中,您可能正在闲置或者您想要显示一般视图的信息,每隔一秒左右,您将遍历所有threads然后读取该信息(在每次阅读之前,你必须锁定/解锁互斥锁。)