Примечание: я знаю, что это небезопасно и не определено стандартом, чтобы посмотреть, определено ли оно моим компилятором или безопасно на практике.
Я перебираю диапазон карты в одном потоке, потенциально вставляя в другой поток
// thread 1:
for(auto it = map.begin(); it != map.end(); ++it){
// it's okay if "it" is out of order, repeats an element, or skips an element
// it's bad if "it" can skip map.end() or turn to mush (invalid iterator)
}
// thread 2:
map[Key(...)] = Type(...); // insertions are extremely rare but inevitable
Это небезопасно, но ... как небезопасно? Эта карта служит подсказкой по оптимизации для облегчения конкуренции за потоки, поэтому сама по себе она не может способствовать этому конфликту. Если возможными исходами являются только то, что вставленный элемент может быть пропущен или что он будет считывать элементы не по порядку или дважды, это приемлемо и ничего не сломает.
Повернет ли это итераторы в суп или приведет к пропуску map.end()
? Это только два результата, которые могут разрушить мою жизнь.