Ad esempio, è necessario bloccare un valore bool
durante il multithreading?I tipi di dati primitivi sono in C# atomic (thread safe)?
risposta
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
.
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
@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
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
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.
I tipi primitivi statici sono thread-safe, quindi non è necessario bloccare le variabili digitate. Tuttavia, non è garantita alcuna variabile di istanza di un tipo primitivo. Vedi qui: Are primitive types like bool threadsafe ?
Ed ecco un altro link utile che potrebbe anche essere di interesse che trovo la soluzione molto interessante: SO Domanda: How do I know if a C# method is thread safe?
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".
- 1. I tipi di dati primitivi thread-safe in Java
- 2. I puntatori sono tipi primitivi in C++?
- 3. Verifica se i tipi (primitivi) sono fondibili in C++
- 4. I generatori sono thread-safe?
- 5. I metodi statici sono thread-safe
- 6. I metodi IEnumerable Linq sono thread-safe?
- 7. I contenitori Python incorporati sono thread-safe?
- 8. Perché i tipi primitivi in C# hanno le proprie operazioni?
- 9. Stack C++ thread-safe
- 10. Mappa thread-safe C++
- 11. Perché i tipi di dati primitivi Java non si chiamano tipi di dati java?
- 12. tipi primitivi come oggetti in C++
- 13. CreateDirectory() in C# thread-safe?
- 14. I flussi di output standard in C++ sono thread-safe (cout, cerr, clog)?
- 15. C#: eventi thread-safe
- 16. array lock-safe senza thread
- 17. I parametri del metodo sono thread-safe in Java?
- 18. Quali operazioni nel nodo sono thread-safe?
- 19. I gestori di eventi non sono thread safe?
- 20. Diversi tipi di set thread-safe in Java
- 21. C++ 11 coda thread-safe
- 22. Perché le librerie C++ spesso definiscono i propri tipi primitivi?
- 23. TypeConverters rotto per i tipi primitivi?
- 24. Modificatore const C++ con tipi primitivi
- 25. efficiente Singleton thread-safe in C++
- 26. I metodi della classe Ruby sono thread-safe?
- 27. I canali/stub in gRPC thread-safe
- 28. tipi primitivi enum - esiste
- 29. stdout thread-safe in C su Linux?
- 30. coda non bloccabile thread-safe in C++?
Nella maggior parte dei casi, se si scrive da due thread, è necessario utilizzare un blocco ... –
Vorrei quindi fare ciò che dice Mitch. =) –