Являются ли операции чтения и записи в невыровненные поля в .NET абсолютно атомарными?

Спецификация C # (ECMA-334 а такжеИСО / МЭК 23270) есть параграф об атомарности чтения и записи:

12.5 Атомарность ссылок на переменные

Чтения и записи следующих типов данных должны быть атомарными: типы bool, char, byte, sbyte, short, ushort, uint, int, float и reference. Кроме того, чтение и запись перечислимых типов с базовым типом в предыдущем списке также должны быть атомарными. Чтение и запись других типов, включая long, ulong, double и decimal, а также определяемые пользователем типы, не обязательно должны быть атомарными.

Но мне трудно представить, что это всегда так. Например, я могу расположить структуру, используяStructLayout атрибути принудительно выровнять поля:

// 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
}

Теперь, когда я делаю это, я думаю, что написать вint являетсяне атомарный, поскольку он не выровнен по естественной границе:

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

Итак, действительно ли это атомарно (как сказано в спецификации) или не гарантировано, что оно атомарно (например, на x86)? В любом случае, у вас есть источники, подтверждающие это?

Ответы на вопрос(1)

Ваш ответ на вопрос