我可以在线程中使用 Boost.Geometry.index.rtree 吗?
Posted
技术标签:
【中文标题】我可以在线程中使用 Boost.Geometry.index.rtree 吗?【英文标题】:Can I use Boost.Geometry.index.rtree with threads? 【发布时间】:2015-02-01 19:11:17 【问题描述】:我正在尝试使用来自 Boost.Geometry 的 rtree 创建多线程空间索引,但是我无法确定这是否是线程安全的。我在 rtree.hpp 中看不到任何锁定机制,但我的 C++/Boost 知识处于初学者水平。
Boost.Geometry.index.rtree 线程是否安全?如果不是,那么以安全的方式将它与多个线程一起使用的最佳方法是什么(例如 insert() 调用之间的互斥锁?我可以在 insert() 的同时查询()吗?)。具体来说,我正在尝试获得更好的查询(读取)性能。
【问题讨论】:
【参考方案1】:Boost.Geometry.index.rtree 线程是否安全?
没有
如果不是,那么以安全的方式将它与多个线程一起使用的最佳方法是什么(例如 insert() 调用之间的互斥锁?
最佳?视情况而定。
你需要互斥。您可以使用自旋锁、简单互斥锁、共享/可升级互斥锁等来做到这一点。
我可以在插入() 的同时查询() 吗?)。
当然不是。这就是所谓的数据竞赛,这就是您首先需要互斥(又名监视器)的原因。
具体来说,我正在尝试获得更好的查询(读取)性能。
添加线程不会让事情变得更快。它让事情变得更慢。总是。
诀窍在于您可以同时做其他事情。
您/可以/并行运行多个只读操作。通常,库容器可以安全地从多个线程用于只读操作(尽管您可能希望快速扫描任何隐藏的 mutable
成员(在实现中)。
【讨论】:
漂亮,感谢您快速简洁的回答,非常感谢! 确实,在多个线程中同时执行查询应该是安全的。至于创建,可以考虑为每个线程保留一个 rtree。在开始时,跨线程重新分配输入值(例如,首先按质心的 X 坐标对它们进行排序),并为每个数据块创建一个 rtree。然后在查询期间做同样的事情,同时在所有 rtree 中搜索值。然后在最后收集所有线程的结果。 @AdamWulkiewicz 这实际上是一个好主意,我会试一试,谢谢 :)以上是关于我可以在线程中使用 Boost.Geometry.index.rtree 吗?的主要内容,如果未能解决你的问题,请参考以下文章
boost::geometry::model::segment 模板点类型的构造函数?