Arule для всех стандартных контейнеров:
- Множество считывателей или один писатель на весь контейнер и на каждый элемент.
- Чтение или изменение отдельных элементов(без добавления / удаления элемента) также является операцией чтения в контейнере.
Это только скромно слишком сильно.Вы можете делать небольшое количество вещей, которые нарушают вышеуказанные правила, не будучи условием гонки согласно стандарту.
В стандарте это обычно формулируется в терминах методов const
для контейнера.Метод чтения - const
, метод записи - const
.Исключением является то, что begin()
и end()
и data()
(методы, которые просто возвращают итераторы), не являющиеся const
, считаются const
.
Для итерации и доступа к элементу это сформулированос точки зрения недействительности итератора.Многие операции делают недействительными итераторы, и если итератор становится недействительным недействительным образом с его использованием, это условие гонки.
В качестве примера случая, когда эмпирическое правило выше говорит «нет», а стандарт говорит:"ok":
Вы можете иметь карту и ссылку на значение в карте.Вы можете редактировать значение, в то время как другой поток добавляет пары ключ-значение на карту.
Поскольку никакие итераторы не аннулированы картой, и вы не касаетесь ключа, я полагаю, что нет условий гонки.