【问题标题】:Are iterators from a concurrent hash map safe?来自并发哈希映射的迭代器安全吗?
【发布时间】:2018-08-31 23:43:29
【问题描述】:

我目前正在使用Facebook's concurrent hash map,我想知道这样的事情是否可行:

folly::ConcurrentHashMap<std::string, some_class> m;

// add some elements

const auto it = m.find("a");

// during this time, another thread removes the "a" element

if (it != m.end())
    it->second.something(); // it is now an invalid iterator

在阅读了哈希图的来源之后,我发现了这个:

迭代器持有指向返回元素的危险指针。元素只能在迭代器仍然有效时访问!

这很令人不安,感觉使用任何返回的迭代器都是不安全的,是这样吗?

【问题讨论】:

  • 有什么用吗?有使用迭代器的安全方法。显然,如果您在使用它们之前更改或删除它们指向的元素,那么您将处于危险的境地。
  • 我认为在 folly 命名空间中使用任何东西都是......好吧,愚蠢 ^_^
  • @Galik 好吧,如果您在读取元素时无法删除或更改元素,那么并发哈希映射的意义何在?
  • @UKMonkey 很明显,愚蠢的是“好吧,std 没有做我们想要的。让我们自己构建一个替代 std 的替代品,它可以做我们想要的。会出什么问题?”要么,要么en.wikipedia.org/wiki/Folly

标签: c++ multithreading folly


【解决方案1】:

返回的迭代器可以安全使用;但是,迭代器对象必须处于活动状态才能安全访问取消引用的值。

“危险指针”使引用的值保持活动状态,直到迭代器被破坏。

operator[]at() 返回给定键的实际值,因此不能返回包含危险指针的代理对象。为了确保它们永远不会返回对死对象的引用,它们会返回值的副本。

无论您使用迭代器还是operator[]/at(),您都将在访问数据时对键的值进行操作,而不是对给定键的最新值进行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多