我已经开始从事多线程和点云处理的工作。问题是,我必须在现有的实现上实现多线程,并且有太多的读和写操作,所以使用互斥锁不能提高性能,因为来自grid的读取操作太多。
最后,我修改了代码,使我可以有一个vtkSmartPointer<vtkUnstructuredGrid>,它保存了我的点云。线程所要做的唯一操作就是使用GetPoint方法访问点。但是,即使您有智能指针的只读操作,线程也不安全.
正因为如此,我不得不为每个线程复制我的主Point云,这最终会导致内存问题,如果我有太多的线程和大云。
我试着把点云切成块,但是当我有太多的线程时,它又变得太复杂了。我不能保证每个线程的最佳点数来处理。此外,我确实对每个点进行邻域搜索,因此将点云分割成块变得更加复杂,因为为了得到正确的邻域搜索,我需要对每个块进行重叠。
由于vtkUnstructuredGrid是内存优化的,所以我无法用一些STL容器替换它。如果您能推荐我可以用于线程安全的点云处理的数据结构,我会很高兴的。或者如果有其他解决方案我可以用。
提前感谢
发布于 2019-10-28 12:35:44
我只是想贴出解决方案,因为这其实是我的愚蠢。我意识到,在我的代码的一部分中,我使用的是double* vtkDataSet::GetPoint(vtkIdType ptId)版本的GetPoint(),它不是线程安全的。
对于多线程代码,应该使用void vtkDataSet::GetPoint(vtkIdType id,double x[3])。
发布于 2019-10-25 14:50:01
我不熟悉VTK或它是如何工作的。
一般来说,在多线程环境下,提高性能的技术和方法多种多样.这个问题很模糊,所以我只能给出一个笼统的答案。
std::shared_mutex,因为它允许同时进行多次读取。std::atomic实现高效的并发。我不太熟悉它,它肯定不是简单的,但你可以在网上寻求它的教程。据我所知,这类方法的某些部分仍在研究和开发中,最佳实践尚未开发。P.S.如果对同一数据有许多读/写.实现是否知道数据是在多个线程上共享的?它的表现是否正确?您可能最终需要重写整个实现。
https://stackoverflow.com/questions/58555312
复制相似问题