As leituras e gravações em campos desalinhados no .NET são definitivamente atômicas?

A especificação C # (ECMA-334 eISO / IEC 23270) tem um parágrafo sobre a atomicidade de leituras e gravações:

12.5 Atomicidade de referências variáveis

As leituras e gravações dos seguintes tipos de dados devem ser atômicas: bool, char, byte, sbyte, short, ushort, uint, int, float e tipos de referência. Além disso, leituras e gravações de tipos enum com um tipo subjacente na lista anterior também devem ser atômicas. As leituras e gravações de outros tipos, incluindo long, ulong, double e decimal, bem como tipos definidos pelo usuário, não precisam ser atômicas.

Mas tenho dificuldade em imaginar que isso seja sempre verdade. Por exemplo, posso esquematizar uma estrutura usando oStructLayout atributoe forçar os campos a ficarem desalinhados:

// sizeof(MyStruct) == 9
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct MyStruct
{
    public byte pad;   // Offset: 0
    public int value1; // Offset: 1
    public int value2; // Offset: 5
}

Agora, quando eu fizer isso, eu pensaria que escrever para oint énão atômico, já que não está alinhado com o limite natural:

MyStruct myStruct = new MyStruct();
myStruct.value1 = 20;

Então, é definitivamente atômico (como a especificação diz), ou não é garantido que seja atômico (por exemplo, em x86)? De qualquer forma, você tem alguma fonte para isso?

questionAnswers(1)

yourAnswerToTheQuestion