【问题标题】:Concurrent access to different keys in Map C++并发访问 Map C++ 中的不同键
【发布时间】:2015-09-29 08:43:12
【问题描述】:

我有两个线程,其中一个线程“A”向映射中插入一个键 X,并且该线程“A”经常修改同一个键 X。

在某个特定点,线程“A”完成了对该键 X 的修改,然后线程“B”将读取键“X”并从映射中删除键“X”。

当线程“B”读取和删除映射时,线程“A”将同时在映射中插入和写入一些其他键(不是同一个键X)。

在这种情况下,地图需要同步吗?由于线程“B”确定键“X”已被线程“A”完全修改,因此不会再对该键“X”进行并发修改。

【问题讨论】:

  • 看看这个SO answer。您会注意到删除/重新分配可能会导致数据竞争。 IMO,您应该考虑使用tbb::concurrent_hash_map
  • 我不是在谈论删除另一个线程正在处理的相同键。我正在删除一个将不再处理的键,而其他键插入正在映射中发生。
  • 是的;删除一个键可能会以影响其他键查找的方式修改映射。

标签: c++ multithreading dictionary concurrency race-condition


【解决方案1】:

是的,您需要同步。

插入和删除可以改变映射类的内部状态,该状态可能与其他类似操作重叠(即使它们针对不同的键)。

当线程 A 更新对象时,您不需要锁定地图。 Map 保证迭代器和对象指针在插入/删除时是稳定的,因此您的对象不会被触及。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多