c++不能理解为什么这段代码不是线程安全的
C++ cannot understand why this code is not thread safe
已经创建了一些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的方法中。这样的组合是线程安全的。)
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 如何以线程安全的方式更改目录?
- 线程安全的引用计数队列C++
- 析构函数和线程安全
- 适用于大型数组的无复制线程安全环形缓冲区