来自并发哈希映射的迭代器是否安全?

Mic*_*ith 6 c++ multithreading folly

我目前正在使用Facebook的并发哈希映射,我想知道这样的事情是否可行:

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
Run Code Online (Sandbox Code Playgroud)

在阅读了哈希映射的源代码后,我发现了这个:

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

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

Man*_*rse 8

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

'危险指针'使参考值保持活动状态,直到迭代器被破坏.

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

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