C++ 在std::map或std::unordered_map中插入过多项时的奇怪行为

C++ 在std::map或std::unordered_map中插入过多项时的奇怪行为,c++,multithreading,stl,vtk,C++,Multithreading,Stl,Vtk,我正在处理点云,我使用std::map对云进行下采样。地图中的键保存空间索引,向量保存点的ID。从这个映射中,我提取了一些要处理的点,并且处理是使用多线程(而不是映射的部分)完成的。此时,地图已超出范围。然而,当我的云太大,下采样率太低时,我会得到一个非常奇怪的行为。即使我使用所有的逻辑线程,我的cpu使用率也会下降到60-70%。当我在没有地图的情况下进行下采样时(通过简单地跳过点),我不明白这个问题。我检查了所有线程是否都在运行,并且我的应用程序没有互斥锁,它们只从云中读取,这是一个vtku

我正在处理点云,我使用
std::map
对云进行下采样。地图中的键保存空间索引,向量保存点的ID。从这个映射中,我提取了一些要处理的点,并且处理是使用多线程(而不是映射的部分)完成的。此时,地图已超出范围。然而,当我的云太大,下采样率太低时,我会得到一个非常奇怪的行为。即使我使用所有的逻辑线程,我的cpu使用率也会下降到60-70%。当我在没有地图的情况下进行下采样时(通过简单地跳过点),我不明白这个问题。我检查了所有线程是否都在运行,并且我的应用程序没有互斥锁,它们只从云中读取,这是一个
vtkunstucturedgrid
且线程安全的只读操作。我不明白为什么会发生这样的事情


是否会因为
map::max_size()
而发生此问题,因为当我减小贴图的大小时,我没有任何问题。为什么它会导致我的多线程部分出现问题?我的问题是,插入元素以映射超过
max\u size
是否会导致某种未定义的行为?谢谢。

你说的“奇怪的行为”是什么意思?你可以考虑用一个排序向量来替换<代码> STD::MAP<代码>(如果你真的需要排序)。由于内存碎片
std::map
has,可能会导致大量缓存未命中。如果没有看到代码,我们将无法为您提供太多信息。这听起来像是线程争用问题,但您说您没有任何要锁定的共享状态。也可能是UB。它也可能是一个缓存问题映射不将对象放在彼此靠近的位置。到的映射可以将节点放在内存中的任何位置。如果您想要局部性,您可以创建一个像向量一样的容器。@AliKanat映射,特别是
std::map
被实现为一个RBTree。这意味着它有节点。这些节点是按需分配的,因此每次添加对象时,即使对象以有序方式链接,该节点在内存中的分配位置也取决于分配器。它们可能彼此相邻,可能在内存的“不同端”。