Параллельные записи в vector
никогда не выглядят нормально, потому что базовая реализация зависит от прокси-объекта типа vector
, который действует так, как если бы он был ссылкой на bool, но на самом деле будет извлекать и обновлять байты поля бит по мере необходимости ,
При использовании нескольких потоков без синхронизации может произойти следующее: поток 1 должен обновлять бит и считывает содержащий его байт. Затем поток 2 читает один и тот же байт, затем поток 1 обновляет бит и записывает байт назад, а затем поток 2 обновляет другой бит и записывает байт назад, перезаписывая редактирование потока 1.
Это просто один из возможных сценариев, есть и другие, которые приведут к тому же искажению данных.
В ситуации vector
, если вы абсолютно уверены , что все потоки записать одно и то же значение в вектор, то эта операция, как правило, не приведет к повреждению данных. Тем не менее, стандарт, конечно, всегда очень осторожен и определяет все параллельные обращения к ячейке памяти, из которых, по крайней мере, один является доступом к записи, является неопределенным поведением:
Две оценки выражений конфликтуют, если один из них изменяет местоположение памяти, а другой считывает или изменяет одну и ту же ячейку памяти. - intro.races / 2
blockquote>Поэтому, как только вы выполните любую операцию модификации одного элемента из двух разных потоков, у вас будет состояние гонки и необходима правильная синхронизация, например используя
std::atomic
.