La specifica C# (ECMA-334 e ISO/IEC 23270) ha un paragrafo sulla atomicità di legge e scrive:Vengono letti e scritti su campi non allineati in .NET decisamente atomici?
12,5 Atomicità di riferimenti variabili
legge e scrive i seguenti tipi di dati deve essere atomica: bool, char, byte, sbyte, short, ushort, uint, int, float e tipi di riferimento. Inoltre, anche le letture e le scritture dei tipi di enumerazione con un tipo sottostante nell'elenco precedente devono essere atomiche. Le letture e le scritture di altri tipi, inclusi lunghi, ulong, double e decimal, così come i tipi definiti dall'utente, non devono necessariamente essere atomici.
Ma ho difficoltà a immaginare che sia sempre vero. Ad esempio, posso layout di una struct utilizzando il StructLayout
attribute, e costringere i campi di essere non allineato:
// 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
}
Ora, quando faccio questo, vorrei che la scrittura al int
è non atomica, dal momento che è non allineato al confine naturale:
MyStruct myStruct = new MyStruct();
myStruct.value1 = 20;
Quindi, è sicuramente atomica (come la specifica dice), o non è garantito per essere atomica (ad esempio su x86)? In ogni caso, hai qualche fonte per fare questo?
Jon è, naturalmente, corretta; se interrompi deliberatamente l'allineamento, hai anche deliberatamente rotto l'atomicità. Se fa male quando lo fai allora ** non farlo **. –