有效地从工作线程中读取信息

时间:2010-12-28 18:30:21

标签: c++ multithreading

我正在编写一些计算机视觉软件,这里有一个简短的描述来帮助澄清问题:

  • 我有3台摄像机,每台摄像机以60fps
  • 运行
  • 每个摄像头都有自己的线程,以利用多个核心
  • 每个线程等待新帧到达,对图像进行一些处理,保存结果并等待下一帧

我的主程序使用boost创建这些线程,遵循本教程:http://blog.emptycrate.com/node/282

我目前正在紧密循环中轮询线程以检索数据,例如:

while(1) {
    for(i=0; i<numCams; i++) {
        result[i] = cam[i]->getResult();
    }

    //do some stuff
}

这看起来很傻。有没有一种标准方法让主程序知道有新结果并且需要检索它?

谢谢!

5 个答案:

答案 0 :(得分:2)

是的,您需要使用condition variables(AKA事件)。

答案 1 :(得分:0)

是的,您需要使用同步。根据您使用的线程API,有许多形式,但最简单的可能是条件变量。

答案 2 :(得分:0)

您需要的是一个线程池。摄像机的数量不必与最佳线程数相同。线程池针对性能进行了优化。然后,您不需要等待条件或轮询作业,您将线程池中的作业(通常是std::function<void()>)排入队列,并且该作业对象应该执行所有必需的工作。使用绑定器(std::bind)或lambda函数创建作业对象。

答案 3 :(得分:0)

在您的情况下,您正在与硬件进行通信,因此您可能需要使用相机API提供的任何设施来异步通知数据。通常这将是您提供的某种回调,或者偶尔会出现类似Windows事件句柄或Unix信号。

一般来说,如果你的意思是“标准”,就像“C ++标准的一部分”那样,没有。您需要使用操作系统的设备进行进程间(或线程)状态信号传输。

请注意,如果我们在谈论Ada(或Modula-2,或许多其他现代系统编程语言),那么答案就是“是”。我知道有一些关于将某种并发支持纳入未来C ++标准的讨论。

与此同时,还有boost::thread库来做这种事情。这不完全是“标准”,但对于C ++来说,它非常接近。我想你想做什么,condition variables可能就是你想要的。但是,如果您阅读整个设施,您可能会遇到其他更简单的设计。

答案 4 :(得分:0)

我知道这听起来有点奇怪,但是考虑使用boost::asio::io_service它就像你目前所接近的线程池一样。捕获图像后,您可以post到此服务,然后服务可以异步执行处理程序来处理图像数据。