在一些OpenCV功能上创建了C ++包装器并将其导出为PInvoke,可以并行调用它。
坚果:
void execute(Document& d) {
ScriptConfig conf(d);
Context c(conf);
OperationManager m;
while (c.next()) {
unique_ptr<OperationBase> op = m.create(*c.getCurrentOp());
// m.create inside ALWAYS creates unique_ptr<OperationBase>(NEW ConcreteOperationBase());
//nothing cached
op->prepare(&c);
op->execute();
op->afterExecute();
}
}
内部操作与其上下文一起使用并在OpenCV中执行一些操作。 Context支持Mat的操作实例。
此代码不是线程安全的。如果我尝试使用多次执行emmidiatly,他们会随机打破彼此的工作。它看起来像操作无效,在&gt; out垫子中可以使用。
我在操作中检查opencv相关代码是线程安全的 - 没关系。
当我按照以下方式修复它时:
mutex _locker;
void execute(文档&amp; d){
ScriptConfig conf(d);
Context c(conf);
OperationManager m;
while (c.next()) {
_locker.lock();
unique_ptr<OperationBase> op = m.create(*c.getCurrentOp());
// m.create inside ALWAYS creates unique_ptr<OperationBase>(NEW ConcreteOperationBase());
//nothing cached
op->prepare(&c);
op->execute();
op->afterExecute();
_locker.unlock();
}
}
多线程没有问题。但这不是我想要的 - 我必须并行调用操作!
答案 0 :(得分:1)
并非所有“OperationBase”实例都并行使用相同的“上下文”吗?
答案 1 :(得分:1)
Mat&amp; amp;存储在OperationBase中并使用.prepare()方法设置。我是C#的家伙,所以对我来说&#34;参考&#34;是&#34;共享指针&#34;不多。我已经重写了OperationBase的所有代码,不存储refs或指向存储在Context中的mats的指针,并且总是在Operation的方法中将它们作为Mat *。这样的组合变得线程安全。 )