.net System.MemberwiseClone и блокировка операций записи

При выполнении MemberwiseClone массива типов значений:

 var arr = new double[100];

Если эти двойники изменяются с помощью Interlocked write в других потоках, будет ли копия MemberwiseCloned подвергаться риску разрыва двойников в ней? Меня не беспокоят слегка устаревшие значения, просто разрыв и взаимодействие между interlocked и memberwiseclone (что, как я полагаю, переводится в операцию типа блитирования памяти?)


person DanH    schedule 12.06.2012    source источник


Ответы (1)


да. В 32-битных операционных системах это даже гарантированно может привести к разрыву. В 64-битной версии это определяется реализацией. Я бы не стал легко рисковать, потому что даже если вы проверите, что этого не произойдет, ваш тест был только на вашей конкретной версии .NET и на вашем конкретном оборудовании. Вы не можете быть уверены.

В 64-разрядной версии вы можете надежно предотвратить разрыв, внедрив собственную версию клона (которая, скорее всего, будет ненамного медленнее).

person usr    schedule 12.06.2012
comment
Хорошо, правильно ли я думаю, что memcpy на 32-битной версии работает в 32-битных фрагментах, следовательно, существует риск разрыва двойных значений, в то время как на 64-битной версии она будет работать на 64-битном уровне, поэтому должно быть атомарным для каждого значения? Как бы вы реализовали безопасный 64-битный клон в .net? - person DanH; 12.06.2012
comment
С циклом for копирование удваивается. Простой. Вы можете работать быстрее с тем же самым + небезопасный код + цикл разворачивается 8 раз. - person usr; 12.06.2012
comment
Итак, memcpy не является командой блит-типа памяти на уровне одного процессора и фактически является циклом? - person DanH; 12.06.2012
comment
memcpy имеет множество возможных реализаций. Многие даже копируют 64-битные фрагменты на 32-битное оборудование (используя SSE). Я хочу сказать, что вы не можете полагаться на него. Поэтому вам нужно свернуть свой собственный. По сути, каждый memcpy представляет собой тугую петлю. - person usr; 12.06.2012
comment
спасибо, не знаю, почему я подумал, что это какая-то волшебная реализация, поскольку вы вызвали у меня воспоминания о просмотре реализаций memcpy еще в мои дни C ++. - person DanH; 12.06.2012