Безопасны ли итераторы из параллельной хэш-карты?

в настоящее время я использую параллельная хэш-карта 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

прочитав источник хэш-карты, я наткнулся на следующее:

итераторы содержат указатели опасности на возвращаемые элементы. Элементы могут быть доступны только тогда, когда итераторы все еще действительны!

Это довольно тревожно, и кажется, что использование любых возвращенных итераторов небезопасно, так ли это?

1 ответов


возвращаемые итераторы безопасны для использования; однако объект итератора должен быть живым для безопасного доступа к разыменованному значению.

"указатель опасности" сохраняет указанное значение до тех пор, пока итератор не будет уничтожен.

operator[] и at() возвращает фактическое значение для данного ключа, и поэтому не может возвращать прокси-объект, содержащий указатель опасности. Чтобы гарантировать, что они никогда не возвращают ссылку на мертвый объект, они вместо этого возвращают копию значение.

используете ли вы итераторы, или operator[]/at(), вы будете работать со значением для ключа во время доступа к данным, а не с последним значением для данного ключа.