在插入其他线程时有效地遍历地图

jco*_*der 3 c++ thread-safety data-structures

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

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

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

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

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

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

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

ste*_*anv 5

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

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