¿Las lecturas y escrituras en campos no alineados en .NET son definitivamente atómicas?
La especificación de C # (ECMA-334 yISO / IEC 23270) tiene un párrafo sobre la atomicidad de las lecturas y escrituras:
12.5 Atomicidad de las referencias variables.
Las lecturas y escrituras de los siguientes tipos de datos serán atómicas: bool, char, byte, sbyte, short, ushort, uint, int, float y tipos de referencia. Además, las lecturas y escrituras de tipos de enumeración con un tipo subyacente en la lista anterior también serán atómicas. Las lecturas y escrituras de otros tipos, incluidos los tipos long, ulong, double y decimal, así como los definidos por el usuario, no necesitan ser atómicos.
Pero me cuesta imaginar que eso sea siempre cierto. Por ejemplo, puedo diseñar una estructura usando elStructLayout
atributo, y obliga a los campos a no estar alineados:
// 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
}
Ahora, cuando hago esto, creo que la escritura a laint
esno atómico, ya que no está alineado con el límite natural:
MyStruct myStruct = new MyStruct();
myStruct.value1 = 20;
Entonces, ¿es definitivamente atómico (como dice la especificación), o no se garantiza que sea atómico (por ejemplo, en x86)? De cualquier manera, ¿tienes alguna fuente para respaldar esto?