3

我有一个std::map < std::string, std::string > 从一个线程以不规则的间隔添加值(但经常并且需要非常快),并且偶尔会删除一组条目。

我需要从不同的线程将地图的快照作为文本转储到用户的调试登录命令。

显然,仅迭代输出调试信息的映射不是线程安全的,而它可以被更新,因此我目前在转储数据之前获取读锁(互斥锁),并为每个插入或删除设置写锁。这工作正常,但我不能真正锁定地图这么长时间,它会延迟传入更新的处理太多。

我不相信我可以锁定和解锁每个项目的调试转储线程,因为从另一个线程修改映射会使我相信的迭代器无效。

有没有什么方法可以安全地做到这一点,而不必在我写出整个数据结构时取出读锁,以便仍然可以快速插入新值?我意识到,如果在我迭代时可以添加和删除值,我将无法获得一致的数据视图,但只要可以理解它是安全的。

如果没有办法为此使用地图,任何人都可以建议我可以使用的任何其他数据结构吗?

编辑:我希望有一个解决方案,这意味着我在添加项目时不需要拿出昂贵的锁。

4

1 回答 1

5

目前我可以看到两种解决方案:

  1. (简单,但可能仍然需要很长时间):在锁定时复制地图(或分配给另一个容器),然后在未锁定时将本地副本转储到调试日志
  2. (更多工作):通过队列将地图的更新委托给另一个线程。如果另一个线程是转储到调试日志的线程,那么您就不再需要锁了。这样,快速线程仅在访问队列时才被锁定。
于 2012-08-07T14:14:52.830 回答