Я тинкер - в этом нет сомнений. По этой причине (и совсем немного дальше) я недавно провел небольшой эксперимент, чтобы подтвердить мое подозрение, что запись в struct
не является атомарной операцией, что означает , что так называемый «неизменный» Тип значения, который пытается применить определенные ограничения, может гипотетически потерпеть неудачу при достижении своей цели.
Я написал сообщение в блоге об этом , используя следующий тип в качестве иллюстрации:
struct SolidStruct
{
public SolidStruct(int value)
{
X = Y = Z = value;
}
public readonly int X;
public readonly int Y;
public readonly int Z;
}
Хотя вышеприведенное выглядит как тип, для которого никогда не может быть верным, что X != Y
или Y != Z
, на самом деле это может произойти, если значение равно "mid «назначение» одновременно копируется в другое место отдельным потоком.
Хорошо, большое дело. Любопытство и немного больше. Но потом у меня возникло такое предчувствие: мой 64-битный процессор должен на самом деле иметь возможность копировать 64 бита атомарно, верно? Так что, если я избавился от Z
и просто застрял с X
и Y
? Это только 64 бита; должна быть возможность перезаписать их за один шаг.
Конечно, это сработало. (Я понимаю, что некоторые из вас, вероятно, морщат брови прямо сейчас, думая, Да, да. Как это вообще интересно? Приколите меня. Конечно, я понятия не имею, гарантировано ли это или нет для моей системы. Я почти ничего не знаю о регистрах, промахах кэша и т. Д. (Я буквально просто срыгиваю термины, которые я слышал, не понимая их значения); на данный момент для меня это черный ящик.
Следующее, что я попробовал - опять же, просто догадка - была структура, состоящая из 32 битов с использованием полей 2 short
. Это, казалось, также демонстрировало «атомарную присваиваемость». Но затем Я попробовал 24-битную структуру, используя 3 byte
поля: no go .
Внезапно структура снова оказалась восприимчивой к копиям "среднего назначения".
До 16 битов с 2 byte
полями: снова атомарный!
Может ли кто-нибудь объяснить мне, почему это так? Я слышал о «битовой упаковке», «распределении строк кэша», «выравнивании» и т. Д., Но, опять же, я действительно не знаю, что все это значит, и не важно ли это здесь. Но я чувствую как будто я вижу образец, не имея возможности точно сказать, что это такое; ясность будет принята с благодарностью.