Потокобезопасность в массивах C#

Делает наличие 2 различных потоков:

  • одно чтение из массива C# (например, из первого местоположения),
  • и другой пишущий в тот же массив C#, но в другое местоположение (например, к последнему местоположению)

ориентировано на многопотоковое исполнение или нет?
(И я имею в виду здесь, не блокируя чтение, ни запись),

12
задан Betamoo 9 May 2010 в 19:38
поделиться

3 ответа

Этот конкретный случай безопасен, да.

Чтение и запись в разные части массива не мешает другим операциям.

Однако чтение и запись в одно и то же место может вызвать проблемы, в зависимости от типа элемента и размера элементов.

8
ответ дан 2 December 2019 в 18:18
поделиться

Короче говоря: да. До тех пор, пока он находится в двух разных местах, это безопасная операция.

Некоторое время назад было обсуждение этого, там есть полезная информация, если вам интересно.

5
ответ дан 2 December 2019 в 18:18
поделиться

Я не уверен, что это безопасно. Представьте, что у вас есть байт []. Эти байты плотно упакованы в памяти. Теперь, если вы измените эти байты, компилятор может объединить некоторые операции записи для выполнения операций чтения и записи размером слово (32 бита). На некоторых процессорах, например ARM, это единственный вид команд изменения памяти, которые есть у компилятора. Это особенно удобно, если вы изменяете более одного байта за раз. ЦП тоже может делать то же самое. Он также может изменять порядок вещей без вашего ведома. При такой оптимизации поток, читающий смежную память, может увидеть частичные изменения. Обычно вы не видите такого эффекта, потому что распределитель кучи вам удобен и всегда дает вам память, которая, по крайней мере, выровнена по словам.

7
ответ дан 2 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: