Я бездельник, не сомневаюсь. По этой причине (и очень немногим выше этого) я недавно сделал небольшой эксперимент, чтобы подтвердить мое подозрение, что запись в 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
, на самом деле это может произойти, если значение является "промежуточным присвоением", в то же время оно копируется в другое место по отдельному потоку.
ОК, большое дело. Любопытство и немного больше. Но тогда у меня была такая догадка: мой 64-битный процессор должен действительно иметь возможность копировать 64 бита атомарно, не так ли? Так что, если бы я избавился от Z
и просто застрял с X
и Y
? Это всего лишь 64 бита; их можно будет перезаписать за один шаг.
Конечно, это сработало. (я понимаю, что некоторые из вас, вероятно, сейчас бороздят ваши брови, думая: "Да, дух. Как это вообще интересно?" Юмор.) Конечно, у меня есть не знаю, гарантировано ли это или не дано моей системе. Я почти ничего не знаю о регистрах, пропущенных кешках и т.д. (Я буквально просто срываю термины, которые я слышал, не понимая их смысла); так что на данный момент это черный ящик.
Следующее, что я попробовал - снова, только на догадке, - это структура, состоящая из 32 бит с использованием полей 2 short
. Казалось, что это тоже "атомарная уступчивость". Но потом я попробовал 24-битную структуру, используя поля 3 byte
: не идти.
Внезапно структура оказалась восприимчивой к копиям "среднего назначения" еще раз.
До 16 бит с полями 2 byte
: атомный снова!
Может кто-нибудь объяснить мне, почему это? Я слышал о "бит-упаковке", "линии кэширования", "выравнивании" и т.д., Но опять-таки, я действительно не знаю, что все это значит, и не имеет ли здесь значения. Но я чувствую, что вижу образец, не имея возможности сказать точно, что это такое; ясность была бы с благодарностью.