【发布时间】:2016-07-26 16:17:16
【问题描述】:
我在 4 个不同的 Mat 对象上调用了这个 opencv 图像处理函数 4x。
void processBinary(Mat& binaryMat) {
//image processing
}
我想对它进行多线程处理,以便所有 4 个方法调用同时完成,但让主线程等待每个线程完成。
例如:
int main() {
Mat m1, m2, m3, m4;
//perform each of these methods simultaneously, but have main thread wait for all processBinary() calls to finish
processBinary(m1);
processBinary(m2);
processBinary(m3);
processsBinary(m4);
}
我希望实现的是能够根据需要多次调用 processBinary() 并且与只调用一次方法具有相同的效率。我已经查找了多线程,但是在调用线程然后加入/分离它们时有点困惑。我相信我需要实例化每个线程,然后在每个线程上调用 join() 以便主线程等待每个线程执行,但执行时间似乎没有显着增加。谁能解释我应该如何对我的程序进行多线程处理?谢谢!
编辑:我尝试过的:
//this does not significantly increase execution time. However, calling processBinary() only once does.4
thread p1(&Detector::processBinary, *this, std::ref(m1));
thread p2(&Detector::processBinary, *this, std::ref(m2));
thread p3(&Detector::processBinary, *this, std::ref(m3));
thread p4(&Detector::processBinary, *this, std::ref(m4));
p1.join();
p2.join();
p3.join();
p4.join();
【问题讨论】:
-
你描述的工作是一个管道。每个函数都在获取前一阶段的输出。要实现并行性,您需要能够在工作流程的各个阶段之间移动较小的工作。换句话说,如果他们需要另一个任务的输出,他们怎么能并行工作。复制.. Findcontours...绘制轮廓....
-
我不确定我是否理解。我想将 processBinary() 并行放置,因为它被称为 4x ,而不是方法内的代码。每个 processBinary() 在不同的 Mat 对象上调用,因此它们不相互依赖。
-
啊...您应该添加调用
processBinary的代码。我们不需要 processBinary 的内部来帮助您并行化它的调用。 -
对不起,我的解释很糟糕;我更新了这个问题,所以它更有意义:)
-
你试过什么?如果
processBinary是一个纯函数,您只需生成 4 个标准线程并加入它们。
标签: c++ multithreading opencv