Когда у вас есть
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 и половину после увеличения, что может дать значение, которого никогда не было в массиве.
long[] copy = new long[256];
for (int i = 0; i < 256; i++)
copy[i] = myArray[i];
Так является ли вариант Volatile.Read
правильным выбором, учитывая, что я не хочу использовать блокировку?