我可以在线程中使用 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 的线相交

用 boost::geometry 扩展多边形?

使用 boost::geometry::buffer 函数

boost::geometry::model::segment 模板点类型的构造函数?

从 boost::geometry::index::rtree 中删除点的问题

查询与 boost::geometry::index::rtree 的交集