Я пытаюсь создать многопоточный пространственный индекс, используя rtree из Boost.Geometry, однако я не могу определить, является ли это потокобезопасным. Я не вижу никаких механизмов блокировки внутри rtree.hpp, но мои знания C ++ / Boost находятся на начальном уровне.
Является ли поток Boost.Geometry.index.rtree безопасным способом? Если нет, то каков оптимальный подход для безопасного использования его с несколькими потоками (например, блокировка мьютекса между вызовами insert ()? Могу ли я запросить () одновременно с insert ()?). В частности, я пытаюсь получить лучшую производительность запросов (чтения).
Является ли поток Boost.Geometry.index.rtree безопасным способом?
нет
Если нет, то каков оптимальный подход для безопасного использования его с несколькими потоками (например, блокировка мьютекса между вызовами insert ()?
Оптимальное? Зависит.
Вам нужно взаимное исключение. Вы можете сделать это с помощью спин-блокировки, простого мьютекса, общего / обновляемого мьютекса и т. Д.
Могу ли я запросить () одновременно с insert ()?).
Конечно, нет. Это называется гонка данных, и это то, что вам нужно для взаимного исключения (или монитор) в первую очередь.
В частности, я пытаюсь получить лучшую производительность запросов (чтения).
Добавление потоков не делает вещи быстрее. Это делает вещи медленнее. Всегда.
Хитрость в том, что вы можете сделать другие вещи в то же время.
Вы / можете / выполнять несколько операций только для чтения параллельно. Обычно контейнеры библиотеки безопасны для использования из нескольких потоков для операций только для чтения (хотя вам может потребоваться выполнить быстрое сканирование любых mutable
члены скрыты (в реализации).