Структуры являются типами значений.Если вы присвоите структуру переменной / полю / параметру метода, все содержимое структуры будет скопировано из исходного хранилища в место хранения параметра переменной / поля / метода (место хранения в каждом случае равно размерусама структура).
Копирование структуры не обязательно является атомарной операцией.Как написано в спецификации языка C # :
атомарность ссылок на переменные
Чтения и записи следующих типов данных являются атомарными: bool , char , byte , sbyte , short , ushort , uint , int , float и ссылочные типы .Кроме того, чтение и запись перечислимых типов с базовым типом в предыдущем списке также являются атомарными.Чтение и запись других типов, включая long , ulong , double и decimal , а также определяемые пользователем типыне гарантированно быть атомным.Помимо функций библиотеки, разработанных для этой цели, нет гарантии атомарного чтения-изменения-записи, например, в случае увеличения или уменьшения.
Так что да, может случиться так, что пока один поток находится в процессе копирования данных из хранилища структуры, другой поток приходит и начинает копировать новые данные из другой структуры в , чтоместо хранения.Таким образом, поток, копируемый из хранилища, может в итоге скопировать смесь старых и новых данных.
В качестве примечания, ваш код также может страдать от других проблем параллелизма из-за того, как один из ваших потоковпишет в переменную и как переменная используется другим потоком.(Ответ пользователя acelent на другой вопрос объясняет это довольно хорошо с технической точки зрения, поэтому я просто на него ссылаюсь: https://stackoverflow.com/a/46695456/2819245) Вы можете избежать таких проблем, инкапсулируя любой доступ к такой "ветке"Перекрестные переменные в блоке lock
. В качестве альтернативы lock
и в отношении базовых типов данных вы также можете использовать методы, предоставляемые классом Interlocked
, для доступа к переменным / полям, пересекающим поток, в потоке.-обезопасный способ (хотя чередование методов lock
и Interlocked
для одной и той же переменной пересечения потока не очень хорошая идея).