这似乎不是完整的问题。我读到的是两部分。第一部分应该是“我想优化我的程序。我该如何做?”
你应该使用性能分析器在优化之前进行测量!在此过程中,您可能会注意到有更重要的优化可用,如果您过早地引入多线程,则可能会将其推出可能性窗口。
你应该使用性能分析器在优化之后进行测量!发现优化无关紧要并不罕见。在多线程优化方面,从您的测量结果中,您应该看到处理一个任务需要稍长时间,但您可以在具有四核CPU的计算机上同时处理四到八个任务。如果稍长时间相当于4-8倍的因素,那么显然多线程是引入膨胀而不是优化的不必要介绍。
第二部分,您已经提供了这两个语句:
我100%确定,只要Module2工作,RTree就不会改变。
如果我100%确定没有线程修改RTree,那么从不同的线程对boost::geometry::index::rtree进行查询是否安全?
你应该使用锁。如果不使用锁,将会调用未定义的行为。稍后我会解释为什么应该使用锁。
我建议您使用读写锁(例如pthread_rwlock_t)来描述您所描述的用例。这将允许您的线程同时访问资源,只要没有线程尝试写入,并提供更新被推送到线程的栅栏。
为什么应该使用锁?首先,它们保证您的代码将正确运行;任何关于是否安全的担忧都将无效。其次,锁提供了一个栅栏,可以将更新推送到线程;与此相比,任何关于性能影响的担忧应该是微不足道的。
每个线程应该执行多个任务!这就是为什么需要使用栅栏的原因。如果您的线程最终终止并且您稍后创建了新线程,则会产生开销,这当然在执行优化时是不可取的。如果一个线程尽管预计后面还有更多这些任务,但终止了,则该线程可能应该被暂停。
期望您的优化可能会变成工作窃取线程池。这就是优化的本质,当我们针对最重要的优化时。毕竟,有时它远远是最重要的或者唯一的瓶颈。优化这样的瓶颈可能需要采取极端措施。
我之前强调过“应该可以忽略不计”,因为您只有在一定程度上才能看到性能的显着提高;试图在具有4个核心(每个核心2500个线程)的处理器上启动10000个线程(每个线程占用0.5至4.0MB堆栈空间,总共为5-40GB)显然不会非常优化。尽管如此,这是许多人犯错的地方,如果他们有一个分析器来指导他们,他们将更有可能注意到......
如果您的任务涉及可以变为非阻塞的IO,则甚至可以在一个线程上运行多个任务。通常,在查看多线程之前,我会研究这种优化,因为分析器会突出显示。