Безопасный параллельный доступ к последовательным элементам в отдельных потоках безопасен, но если это происходит часто, это может вызвать проблемы с производительностью в коде. Это связано с фундаментальными ограничениями параллелизмана современных процессорах.
Для большинства программ доступ к памяти является основным узким местом.Критические к производительности разделы кода должны быть написаны осторожно, чтобы избежать чрезмерных ошибок в кеше.Кеш имеет несколько уровней, и каждый уровень быстрее предыдущего.Однако, когда данные не находятся в кэше, или когда данные могли быть изменены другим процессором, их необходимо повторно загрузить в кэш.
Процессор не может отслеживать состояние каждого отдельного байта, поэтому вместо этого он отслеживает блоки байтов, называемые линиями кэша.Если какой-либо байт в строке кэша изменяется отдельным ЦП, его необходимо перезагрузить для обеспечения синхронизации.
Доступ к отдельным байтам в разных потоках вызывает перезагрузку только в том случае, если они находятся в одной строке кэша.А поскольку строки кэша являются смежными, доступ к смежным элементам из отдельных потоков обычно приводит к необходимости повторной загрузки памяти в кэш. Это называется ложным совместным использованием, и его следует избегать в параллельном коде, если производительность вызывает сомнения.
При этом, если это случается редко, это, вероятно, хорошо, и вам следует провести тестирование и тестированиекод, прежде чем оптимизировать его.