首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程安全只读替代vtkUnstructuredGrid->GetPoint()

线程安全只读替代vtkUnstructuredGrid->GetPoint()
EN

Stack Overflow用户
提问于 2019-10-25 08:58:38
回答 2查看 200关注 0票数 0

我已经开始从事多线程和点云处理的工作。问题是,我必须在现有的实现上实现多线程,并且有太多的读和写操作,所以使用互斥锁不能提高性能,因为来自grid的读取操作太多。

最后,我修改了代码,使我可以有一个vtkSmartPointer<vtkUnstructuredGrid>,它保存了我的点云。线程所要做的唯一操作就是使用GetPoint方法访问点。但是,即使您有智能指针的只读操作,线程也不安全.

正因为如此,我不得不为每个线程复制我的主Point云,这最终会导致内存问题,如果我有太多的线程和大云。

我试着把点云切成块,但是当我有太多的线程时,它又变得太复杂了。我不能保证每个线程的最佳点数来处理。此外,我确实对每个点进行邻域搜索,因此将点云分割成块变得更加复杂,因为为了得到正确的邻域搜索,我需要对每个块进行重叠。

由于vtkUnstructuredGrid是内存优化的,所以我无法用一些STL容器替换它。如果您能推荐我可以用于线程安全的点云处理的数据结构,我会很高兴的。或者如果有其他解决方案我可以用。

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-28 12:35:44

我只是想贴出解决方案,因为这其实是我的愚蠢。我意识到,在我的代码的一部分中,我使用的是double* vtkDataSet::GetPoint(vtkIdType ptId)版本的GetPoint(),它不是线程安全的。

对于多线程代码,应该使用void vtkDataSet::GetPoint(vtkIdType id,double x[3])

票数 0
EN

Stack Overflow用户

发布于 2019-10-25 14:50:01

我不熟悉VTK或它是如何工作的。

一般来说,在多线程环境下,提高性能的技术和方法多种多样.这个问题很模糊,所以我只能给出一个笼统的答案。

  • Easy:如果读取次数多,写入次数少,请使用std::shared_mutex,因为它允许同时进行多次读取。
  • 中度:如果线程大部分时间都使用不同的数据:它们访问相同的数据数组,但位于不同的位置--那么您可以实现一个处理程序,确保线程在没有交叉的情况下并发地处理不同的数据,如果线程请求处理当前正在处理的数据块,则告诉它处理其他数据或等待。
  • Hard:有一些方法可以通过使用各种内存指令通过std::atomic实现高效的并发。我不太熟悉它,它肯定不是简单的,但你可以在网上寻求它的教程。据我所知,这类方法的某些部分仍在研究和开发中,最佳实践尚未开发。

P.S.如果对同一数据有许多读/写.实现是否知道数据是在多个线程上共享的?它的表现是否正确?您可能最终需要重写整个实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58555312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档