Учитывая массив структуры:
public struct Instrument
{
public double NoS;
public double Last;
}
var a1 = new Instrument[100];
И пул многопоточных задач, который выполняет запись в эти элементы на основании того, что один элемент может быть записан не более чем двумя потоками одновременно, по одному для каждого из двойных полей (существует эффективная очередность восходящего потока по теме).
И знание того, что двойные числа могут быть записаны атомарно на 64-битной системе. (отредактируйте это, ошибочно сказав, что 32 бит изначально)
Мне нужно периодически выполнять расчет, используя все значения в массиве, и я хотел бы, чтобы они были согласованы во время расчета.
Итак, я могу сделать снимок массива с помощью:
var snapshot = a1.Clone();
Теперь вопрос, который у меня есть, касается особенностей синхронизации. Если я сделаю члены изменчивыми, я не думаю, что это вообще поможет клонированию, так как чтение/запись aquire/releases не на уровне массива.
Теперь я мог бы иметь блокировку массива, но это добавит много споров о наиболее частом процессе записи данных в массив. Так что не идеал.
В качестве альтернативы я мог бы иметь блокировку для каждой строки, но это было бы настоящей проблемой, поскольку их все нужно было бы получить до клонирования, в то время как у меня есть резервные копии всех записей.
Теперь на самом деле не имеет значения, имеет ли моментальный снимок самое последнее значение, если это вопрос микросекунд и т. д., поэтому я думаю, что, вероятно, мне могло бы сойти с рук просто отсутствие блокировки. Единственное, что меня беспокоит, это то, может ли быть сценарий, при котором обратная запись кеша не выполняется в течение длительного периода времени. Это то, о чем я должен беспокоиться? Писатели находятся в потоке данных TPL, и единственная логика состоит в том, чтобы установить два поля в структуре. Я действительно не знаю, как или если область действия имеет тенденцию коррелировать с обратной записью в кеш.
Мысли/совет?
edit: что, если бы я использовал блокировку записи в переменные в структуре?
edit2: объем операций записи НАМНОГО выше, чем объем чтения. Есть также две отдельные и параллельные службы, записывающие в поля Nos & Last. Таким образом, они могут быть написаны одновременно одновременно. Это вызывает проблемы с подходом ссылочного объекта для атомарности.
edit3: дополнительная информация. Предположим, массив состоит из 30-1000 элементов, и каждый элемент может обновляться несколько раз в секунду.
ref
), то, что ж, это, вероятно, сработает, но опять же , это вносит сложность. Подход с неизменяемым классом значительно проще. - person Marc Gravell   schedule 12.06.2012volatile
вряд ли вам когда-нибудь поможет. Прочтите статью Эрика Липперта о Атомарность, волатильность и неизменность. Он отговаривает вас от создания изменчивого поля. - person Steven   schedule 13.06.2012