来自并发哈希映射的迭代器是否安全?
Are iterators from a concurrent hash map safe?
我目前正在使用 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
阅读散列映射的源代码后,我遇到了这个:
Iterators hold hazard pointers to the returned elements. Elements can only be accessed while Iterators are still valid!
这很令人不安,感觉使用任何返回的迭代器都是不安全的,是这样吗?
returned 迭代器可以安全使用;但是,迭代器对象必须处于活动状态才能安全访问解除引用的值。
'hazard pointer' 使引用值保持活动状态,直到迭代器被析构。
operator[]
和 at()
return 给定键的实际值,因此不能 return 包含危险指针的代理对象。为了确保他们永远不会 return 对死对象的引用,他们会 return 值的副本。
无论您使用迭代器还是 operator[]
/at()
,您都将在访问数据时对键的值进行操作,而不是给定的最新值关键。
我目前正在使用 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
阅读散列映射的源代码后,我遇到了这个:
Iterators hold hazard pointers to the returned elements. Elements can only be accessed while Iterators are still valid!
这很令人不安,感觉使用任何返回的迭代器都是不安全的,是这样吗?
returned 迭代器可以安全使用;但是,迭代器对象必须处于活动状态才能安全访问解除引用的值。
'hazard pointer' 使引用值保持活动状态,直到迭代器被析构。
operator[]
和 at()
return 给定键的实际值,因此不能 return 包含危险指针的代理对象。为了确保他们永远不会 return 对死对象的引用,他们会 return 值的副本。
无论您使用迭代器还是 operator[]
/at()
,您都将在访问数据时对键的值进行操作,而不是给定的最新值关键。