我正在编写一些计算机视觉软件,这里有一个简短的描述来帮助澄清问题:
我的主程序使用boost创建这些线程,遵循本教程:http://blog.emptycrate.com/node/282
我目前正在紧密循环中轮询线程以检索数据,例如:
while(1) {
for(i=0; i<numCams; i++) {
result[i] = cam[i]->getResult();
}
//do some stuff
}
这看起来很傻。有没有一种标准方法让主程序知道有新结果并且需要检索它?
谢谢!
答案 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
到此服务,然后服务可以异步执行处理程序来处理图像数据。