Я сейчас пользуюсь Сопутствующая хэш-карта 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
Прочитав источник хэш-карты, я наткнулся на это:
Итераторы содержат указатели опасности на возвращаемые элементы. Доступ к элементам возможен только тогда, когда итераторы все еще действительны!
Это довольно тревожно, и кажется, что использование любых возвращаемых итераторов небезопасно, так?
Возвращенные итераторы безопасны для использования; однако, объект итератора должен быть живым, чтобы разыменованное значение было безопасным для доступа.
«Указатель опасности» сохраняет ссылочное значение до тех пор, пока итератор не будет уничтожен.
operator[]
а также at()
вернуть фактическое значение для данного ключа, и поэтому не может вернуть прокси-объект, содержащий указатель опасности. Чтобы гарантировать, что они никогда не вернут ссылку на мертвый объект, они вместо этого возвращают копию значения.
Используете ли вы итераторы, или operator[]
/at()
вы будете работать со значением ключа в тот момент, когда вы обращались к данным, а не с последним значением для данного ключа.
Других решений пока нет …