我目前正在使用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
在阅读了哈希映射的来源后,我发现了这个:
迭代器持有返回元素的危险指针。只有在迭代器仍然有效时才能访问元素!
这非常令人不安,感觉使用任何返回的迭代器都不安全,是这样吗?
答案 0 :(得分:8)
返回的迭代器可以安全使用;但是,迭代器对象必须处于活动状态才能使取消引用的值安全访问。
危险指针&#39;保持引用值保持活动状态,直到迭代器被破坏。
operator[]
和at()
返回给定键的实际值,因此无法返回包含危险指针的代理对象。为了确保它们永远不会返回对死对象的引用,它们会返回值的副本。
无论是使用迭代器还是operator[]
/ at()
,您将在访问数据时操作键的值,而不是给定键的最新值。