Если у вас есть
long[] myArray = new long[256];
, чьи элементы меняются несколькими потоками с использованием
Interlocked.Increment(ref myArray[x])
, точно не получится получить снимок myArray
за один раз.на данный момент, поскольку одновременно происходят незафиксированные записи, поэтому я не пытаюсь получить это.
Так что мне действительно нужно Volatile.Read
каждого элемента, подобного этому, чтобы получить копиюиз всех значений в какой-то момент в прошлом?
long[] copy = new long[256];
for (int i = 0; i < 256; i++)
copy[i] = Volatile.Read(ref myArray[i]);
Поскольку меня не интересует моментальный снимок в какой-то момент времени, устаревшие значения не являются проблемой, но так как 64-битное энергонезависимое чтениене являются атомарными, я боюсь, что следующее может дать мне половину длинного перед инкрементом и половину постинкрементного, что может дать значение, которое никогда не существовало в массиве.
long[] copy = new long[256];
for (int i = 0; i < 256; i++)
copy[i] = myArray[i];
Итаквариант Volatile.Read
- правильный выбор, учитывая, что я не хочу использовать какую-либо блокировку?