2013-03-06 13 views
6

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?

+2

Jon è, naturalmente, corretta; se interrompi deliberatamente l'allineamento, hai anche deliberatamente rotto l'atomicità. Se fa male quando lo fai allora ** non farlo **. –

risposta

6

Penso che tu abbia ragione ... ci sono alcune situazioni in cui, se ti allontani deliberatamente, il sistema non si comporterà secondo le specifiche della lingua. È importante sottolineare che ECMA-335 rende questo esplicito nella partizione sezione I 12.6.6:

Un CLI conforme garantisce che in lettura e scrittura a correttamente allineate memoria sedi non più grande della dimensione della parola nativa (la dimensione di tipo nativo int) è atomico (vedi §I.12.6.2) quando tutti gli accessi in scrittura a una posizione sono della stessa dimensione. Le scritture atomiche devono alterare nient'altro che quelle scritte. A meno che il controllo esplicito del layout (vedere Partition II (Controlling Instance Layout)) sia utilizzato per modificare il comportamento predefinito, gli elementi di dati n. superiori alla dimensione della parola naturale (la dimensione di un nativo int) devono essere allineati correttamente. I riferimenti dell'oggetto devono essere trattati come se fossero memorizzati nella dimensione della parola nativa.

(in grassetto corsivo mio,. Corsivi sono nel spec)

Problemi correlati