2010-03-12 15 views

risposta

15

Non esiste un tipo atomico. Solo le operazioni possono essere atomiche.

lettura e scrittura un tipo di dati che si inserisce in una parola (int su un processore a 32 bit, long su un processore a 64 bit) è tecnicamente "atomica", ma il jitter e/o processore può decidere di riordinare istruzioni e quindi creare condizioni di gara impreviste, quindi è necessario serializzare l'accesso con lock, utilizzare la classe Interlocked per le scritture (e in alcuni casi le letture) o dichiarare la variabile volatile.

La risposta breve è: se due thread differenti possono accedere allo stesso campo/variabile e almeno uno di essi sta scrivendo, è necessario utilizzare una sorta di blocco. Per i tipi primitivi è generalmente la classe Interlocked.

+0

Sì, un'operazione può essere atomica o meno, ma esistono tipi di dati specifici che vengono definiti come tipi atomici perché consentono operazioni atomiche a causa delle loro dimensioni di memoria in relazione alla dimensione della parola sul sistema. – NebuSoft

+1

@NebuSoft: a chi o cosa? Certamente non dalla specifica C#. Vedere la sezione 5.5, * Atomicità dei riferimenti variabili *, che si riferisce specificamente all'atomicità di * read * e * scrive * - non dei tipi stessi. Ogni tipo può essere fatto per consentire operazioni atomiche specifiche e bastano due righe di codice per eseguire un'operazione non atomica su un tipo primitivo. – Aaronaught

+3

Scusa Mi riferivo ai termini in generale: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/package-summary.html http://www-2.cs.cmu.edu/afs/cs/project/pscico/doc/nesl/manual/node14.html http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp ? topic =/com.ibm.ddi.doc/ddi160.htm http://download.oracle.com/docs/cd/B28359_01/gateways.111/b31053/ims_datatype_conver.htm Sto semplicemente sottolineando che è comune riferirsi a una variabile come atomica basata sul tipo in senso generale. – NebuSoft

2

domanda simile here

Per la risposta definitiva andare al spec. :)

Partizione I, sezione 12.6.6 degli stati spec CLI : "Un conforme CLI sarò garanzia che l'accesso in lettura e scrittura a allineati correttamente locazioni di memoria non più grande della dimensione della parola nativa è atomica quando tutti gli accessi in scrittura a hanno la stessa dimensione. "

Così che conferma che s_Initialized sarà mai instabile, e che leggono e scrive ai tipi primitivi che sono atomica.

L'interblocco crea una barriera di memoria per impedire al processore di ricontrollare letture e scritture da . Il blocco crea l'unica barriera richiesta in in questo esempio.

John.

In sostanza, non si verifica un problema di "arresto anomalo" da non bloccare un bool. Quello che potresti avere è una condizione di competizione per l'ordine di cui il bool viene aggiornato o letto. Se vuoi far sì che il bool sia scritto/letto da un ordine specifico, allora dovresti usare una specie di meccanismo di blocco.

2

o meno. C'è una discussione eccellente su questo here, ma la versione breve è, mentre una data lettura o scrittura può essere atomica, che non è quasi mai quello che stai facendo. Ad esempio, se si desidera incrementare un numero intero, è necessario 1) leggere il valore, 2) aggiungerne uno al valore e 3) memorizzare il valore indietro. Qualsiasi di queste operazioni può essere interrotta.

Questo è il motivo per classi come "Interbloccato".