c++不能理解为什么这段代码不是线程安全的

C++ cannot understand why this code is not thread safe

本文关键字:线程 安全 代码 能理解 不能 为什么 段代码 c++      更新时间:2023-10-16

已经创建了一些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中做一些操作。上下文保存Mat的操作实例。

这个代码不是线程安全的。如果我尝试使用几个立即执行的调用,它们会以随机的方式中断彼此的工作。这看起来像操作得到了无效的in->out垫来工作。

我检查了opencv相关的代码在操作是线程安全的-它是好的。

当我以以下方式修复它时:

mutex _locker;

无效执行(Document&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();
            }
        }

No where is No problem with多线程。但这不是我想要的-我必须并行调用操作!

不是所有的"OperationBase"实例使用相同的"上下文"并行?

Mat&它存储在OperationBase中并使用.prepare()方法设置。我是c#的家伙,所以对我来说"引用"是"共享指针",而不是更多。我重写了OperationBase的所有代码,不存储上下文中存储的参考或指针,并始终将它们作为Mat*在Operation的方法中。这样的组合是线程安全的。)