Подтвердить что ты не робот

Защита потоков в массивах С#

Имеет ли 2 разных потока:

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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