0

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

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

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

4

1 回答 1

1

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

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

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

然后,在主线程中,您可能处于空闲状态,或者您想为一般视图显示该信息,每隔一秒左右,您将浏览所有threads信息,然后读取该信息(当然,在每次读取之前,您必须锁定/解锁互斥锁)。

于 2013-10-17T11:00:01.127 回答