Выберите учетную запись бизнес-менеджера для сети аудитории

Параллельные записи в vector никогда не выглядят нормально, потому что базовая реализация зависит от прокси-объекта типа vector::reference, который действует так, как если бы он был ссылкой на bool, но на самом деле будет извлекать и обновлять байты поля бит по мере необходимости ,

При использовании нескольких потоков без синхронизации может произойти следующее: поток 1 должен обновлять бит и считывает содержащий его байт. Затем поток 2 читает один и тот же байт, затем поток 1 обновляет бит и записывает байт назад, а затем поток 2 обновляет другой бит и записывает байт назад, перезаписывая редактирование потока 1.

Это просто один из возможных сценариев, есть и другие, которые приведут к тому же искажению данных.


В ситуации vector, если вы абсолютно уверены , что все потоки записать одно и то же значение в вектор, то эта операция, как правило, не приведет к повреждению данных. Тем не менее, стандарт, конечно, всегда очень осторожен и определяет все параллельные обращения к ячейке памяти, из которых, по крайней мере, один является доступом к записи, является неопределенным поведением:

Две оценки выражений конфликтуют, если один из них изменяет местоположение памяти, а другой считывает или изменяет одну и ту же ячейку памяти. - intro.races / 2

blockquote>

Поэтому, как только вы выполните любую операцию модификации одного элемента из двух разных потоков, у вас будет состояние гонки и необходима правильная синхронизация, например используя std::atomic.

0
задан cokeman19 16 January 2019 в 03:49
поделиться