C ++无法理解为什么这段代码不是线程安全的

时间:2015-10-08 09:35:36

标签: c++ multithreading opencv

在一些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();
            }

        }

多线程没有问题。但这不是我想要的 - 我必须并行调用操作!

2 个答案:

答案 0 :(得分:1)

并非所有“OperationBase”实例都并行使用相同的“上下文”吗?

答案 1 :(得分:1)

Mat&amp; amp;存储在OperationBase中并使用.prepare()方法设置。我是C#的家伙,所以对我来说&#34;参考&#34;是&#34;共享指针&#34;不多。我已经重写了OperationBase的所有代码,不存储refs或指向存储在Context中的mats的指针,并且总是在Operation的方法中将它们作为Mat *。这样的组合变得线程安全。 )