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

Я сейчас пользуюсь Сопутствующая хэш-карта 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

Прочитав источник хэш-карты, я наткнулся на это:

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

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

6

Решение

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

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

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

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

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]