Volatile Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Contiene metodi per l'esecuzione di operazioni di memoria volatile.
public ref class Volatile abstract sealed
public static class Volatile
type Volatile = class
Public Class Volatile
- Ereditarietà
-
Volatile
Commenti
In un sistema multiprocessore, a causa delle ottimizzazioni delle prestazioni nel compilatore o nel processore, le normali operazioni di memoria possono sembrare riordinate quando più processori operano sulla stessa memoria. Le operazioni di memoria volatile impediscono determinati tipi di riordinamento rispetto all'operazione. Un'operazione di scrittura volatile impedisce che le operazioni di memoria precedenti sul thread vengano riordinate dopo la scrittura volatile. Un'operazione di lettura volatile impedisce che le operazioni di memoria successive sul thread vengano riordinate prima della lettura volatile. Queste operazioni potrebbero comportare barriere di memoria su alcuni processori, che possono influire sulle prestazioni.
Si consideri, ad esempio, lo scenario seguente con due thread e due Int32 campi x e y che sono inizialmente zero:
| Thread 1 | Thread 2 |
|---|---|
x = 1; |
int y2 = Volatile.Read(ref y); |
Volatile.Write(ref y, 1); |
int x2 = x; |
La lettura e la scrittura volatili impediscono il riordino delle due operazioni all'interno di ogni thread, ad esempio dal compilatore o dal processore. Indipendentemente dall'ordine in cui queste operazioni si verificano effettivamente su un thread rispetto all'altro thread, anche in un sistema multiprocessore in cui i thread possono essere eseguiti su processori diversi, le operazioni volatili garantiscono che il thread 2 non visualizzerebbe y2 == 1 e x2 == 0. Nel thread 1 la scrittura in x deve apparire prima della scrittura volatile in ye nel thread 2 la lettura di x deve apparire dopo la lettura volatile di y. Pertanto, se il thread 2 vede y2 == 1, deve anche vedere x2 == 1.
Si consideri tuttavia lo stesso scenario precedente con una sequenza specifica in cui si verificano le operazioni:
| Sequenza | Thread 1 | Thread 2 |
|---|---|---|
| 1 | x = 1; |
... |
| 2 | Volatile.Write(ref y, 1); |
... |
| 3 | ... |
int y2 = Volatile.Read(ref y); |
| 4 | ... |
int x2 = x; |
Anche se la scrittura volatile in y nel thread 1 si è verificata prima della lettura volatile di y nel thread 2, il thread 2 potrebbe comunque vedere y2 == 0. La scrittura volatile in y non garantisce che una lettura volatile seguente di y su un processore diverso visualizzerà il valore aggiornato.
Note
- Le letture e le scritture volatili assicurano che un valore venga letto o scritto in memoria e non memorizzato nella cache (ad esempio, in un registro del processore). È quindi possibile usare queste operazioni per sincronizzare l'accesso a un campo che può essere aggiornato da un altro thread o dall'hardware.
- La Volatile classe fornisce anche operazioni di lettura e scrittura per alcuni tipi a 64 bit, Int64 ad esempio e Double. Le letture e le scritture volatili su tale memoria a 64 bit sono atomiche anche su processori a 32 bit, a differenza delle normali letture e scritture.
Le operazioni di memoria volatile sono per casi speciali di sincronizzazione, in cui il blocco normale non è un'alternativa accettabile. In circostanze normali, l'istruzione C# lock, l'istruzione Visual Basic SyncLock e la classe Monitor forniscono il modo più semplice e meno soggetto a errori di sincronizzazione dell'accesso ai dati e la classe Lazy<T> offre un modo semplice per scrivere codice di inizializzazione differita senza usare direttamente il blocco con doppia verifica.
I Volatile.Read metodi e Volatile.Write abilitano la funzionalità non supportata nelle lingue. Per esempio:
Alcuni linguaggi, ad esempio Visual Basic, non riconoscono il concetto di operazioni di memoria volatile. La Volatile classe fornisce tale funzionalità in tali linguaggi.
Note
La chiamata a uno di questi metodi influisce solo su un singolo accesso alla memoria. Per garantire una sincronizzazione efficace per un campo, tutti gli accessi al campo devono usare Volatile.Read e Volatile.Write.
In C# l'uso del
volatilemodificatore in un campo garantisce che ogni accesso a tale campo sia un'operazione di memoria volatile, ma ilvolatilemodificatore non può essere applicato agli elementi della matrice. I Volatile.Read metodi e Volatile.Write possono essere usati negli elementi della matrice.
Metodi
| Nome | Descrizione |
|---|---|
| Read(Boolean) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(Byte) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(Double) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(Int16) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(Int32) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(Int64) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(IntPtr) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(SByte) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(Single) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(UInt16) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(UInt32) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(UInt64) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read(UIntPtr) |
Legge il valore del campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Read<T>(T) |
Legge il riferimento all'oggetto dal campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| Write(Boolean, Boolean) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(Byte, Byte) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(Double, Double) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(Int16, Int16) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(Int32, Int32) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(Int64, Int64) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(IntPtr, IntPtr) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(SByte, SByte) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(Single, Single) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(UInt16, UInt16) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(UInt32, UInt32) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(UInt64, UInt64) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write(UIntPtr, UIntPtr) |
Scrive il valore specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Write<T>(T, T) |
Scrive il riferimento all'oggetto specificato nel campo specificato. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |