C++ 如何在无序地图一直动态变化的情况下读取它

C++ 如何在无序地图一直动态变化的情况下读取它,c++,C++,出于某种原因,我们一直在使用*unordered_map*类型来存储项目中的对象。在运行时,贴图的大小始终在更改,因为它可能随时删除对象或添加新对象。现在我需要在另一个线程中逐个遍历它的对象。你知道我不能通过使用迭代器来实现这一点,因为当映射发生变化时,迭代器可能会失效。因此,我的问题是如何在动态变化的情况下正确地遍历无序的映射。您需要一个互斥锁或其他类型的锁,并且需要确保仅在互斥锁的保护下访问集合。否则,当另一个线程正在或可能正在修改集合时,在一个线程中访问集合是未定义的行为。您所要求的没有意

出于某种原因,我们一直在使用*unordered_map*类型来存储项目中的对象。在运行时,贴图的大小始终在更改,因为它可能随时删除对象或添加新对象。现在我需要在另一个线程中逐个遍历它的对象。你知道我不能通过使用迭代器来实现这一点,因为当映射发生变化时,迭代器可能会失效。因此,我的问题是如何在动态变化的情况下正确地遍历无序的映射。

您需要一个互斥锁或其他类型的锁,并且需要确保仅在互斥锁的保护下访问集合。否则,当另一个线程正在或可能正在修改集合时,在一个线程中访问集合是未定义的行为。

您所要求的没有意义。当您不能定义“当前元素”时,遍历一个不断变化的集合意味着什么?也可能发生的情况是,在您有机会使用之前,您刚刚从表中读取的元素在另一个线程中被删除


<>你最好重新考虑你正在做的任何事情。

< P>一个代替大量使用锁的方法是复制,你可以考虑:
  • 来自第二个线程的这种类型的访问必须频繁发生,以至于锁将导致非常高的运行时开销
  • 从读者的角度来看,数据不必在给定的时间内100%更新
  • 内存占用不是您主要关心的问题

  • 您的读卡器线程可以存储自己的数据副本,该副本只能在已知的同步点定期更新。然后,读线程可以在不使用锁的情况下访问数据任意多次,直到下一次从写线程的副本刷新其数据。

    您必须坚持无序映射还是使用其他数据结构?另外,您是否有一个作者和多个读者,或者多个作者和多个读者?不,我不能,因为它首先在我们的项目中被广泛使用。我既没有权限也没有时间,因为更改可能会对很多事情产生连锁反应。修改无序\u图的线程现在如何协调它们的访问?目前,该无序\u图仅由单个线程访问。但我打算在另一个线程中遍历它。假设他正在处理的代码不是荒谬的,它可能已经有了一个解决这个问题的方法。(除非地图现在只被一个线程访问,在这种情况下,更改将需要一些设计更改。)是的,我知道这听起来像一个悖论,但无论如何我必须实现这一点。我不能改变设计,因为这可能会引起很大的努力,我根本没有权力。我将重新措辞,不使用该术语。我想了解通过复制在多个线程之间表示一个概念性数据块的概念。复制是我考虑过的解决方案之一。正如你所说的,这个解决方案不够好,因为它不能保证数据的一致性。很好的一点。在这种并发情况下,保持数据的一致性是不可避免的。代码现在做了什么?当其他线程可能正在访问它时,它如何修改无序的_映射?(或者只有一个线程接触过无序的_图?或者什么?)是的,在我们当前的设计中只有一个线程可以访问它。啊,那么你有两个明显的选择:1)通过对访问地图的所有代码进行适当的更改,从根本上改变设计,让多个线程可以访问地图。2) 安排使代码在允许访问映射的线程中运行。(或者该线程复制地图并将其提供给您,或者类似的事情。)将设计从单线程更改为多线程不是一个微不足道的更改,而是一个架构更改。如果您打算对映射进行这样的更改,那么它会影响所有使用映射的代码。当然,我认为第二个选项对我来说更有意义。谢谢你的评论。你真好。