Volatile Classe

Definizione

Contiene metodi per l'esecuzione di operazioni relative alla 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 operazioni di memoria regolari potrebbero risultare riordinate quando più processori operano sulla stessa memoria. Le operazioni di memoria volatili impediscono determinati tipi di riordinamento rispetto all'operazione. Un'operazione di scrittura volatile impedisce che le operazioni di memoria precedenti nel 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 volatile e la scrittura impediscono la riordinazione 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 da x deve essere visualizzata prima della scrittura volatile in ye nel thread 2 la lettura di x deve essere visualizzata dopo la lettura volatile di y. Quindi, 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 su y su thread 1 si è verificata prima della lettura volatile del y thread 2, il thread 2 potrebbe comunque vedere y2 == 0. La scrittura volatile in y non garantisce che una lettura volatile seguente di y in un processore diverso visualizzerà il valore aggiornato.

Nota

  • Le letture e le scritture volatili garantiscono che un valore sia 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 da 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 volatili 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 Monitor classe forniscono il modo più semplice e meno soggetto a errori di sincronizzazione dell'accesso ai dati e la Lazy<T> classe offre un modo semplice per scrivere codice di inizializzazione lazy senza usare direttamente il blocco con controllo doppio.

I Volatile.Read metodi e Volatile.Write abilitano le funzionalità non supportate nelle lingue. Ad esempio:

  • Alcuni linguaggi, ad esempio Visual Basic, non riconoscono il concetto di operazioni di memoria volatili. La Volatile classe fornisce tale funzionalità in tali linguaggi.

    Nota

    La chiamata a uno di questi metodi influisce solo su un singolo accesso alla memoria. Per fornire una sincronizzazione efficace per un campo, tutti gli accessi al campo devono usare Volatile.Read e Volatile.Write.

  • In C#, l'uso del volatile modificatore in un campo garantisce che ogni accesso a tale campo sia un'operazione di memoria volatile, ma il volatile modificatore non può essere applicato agli elementi della matrice. I Volatile.Read metodi e Volatile.Write possono essere usati sugli elementi della matrice.

Metodi

Read(Boolean)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(Byte)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(Double)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(Int16)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(Int32)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(Int64)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(IntPtr)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(SByte)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(Single)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(UInt16)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(UInt32)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(UInt64)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read(UIntPtr)

Legge il valore del campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Read<T>(T)

Legge il riferimento a un oggetto dal campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare dopo questo metodo nel codice, il processore non potrà spostarla in una posizione precedente al metodo stesso.

Write(Boolean, Boolean)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(Byte, Byte)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(Double, Double)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(Int16, Int16)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(Int32, Int32)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(Int64, Int64)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(IntPtr, IntPtr)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(SByte, SByte)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(Single, Single)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(UInt16, UInt16)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(UInt32, UInt32)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(UInt64, UInt64)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write(UIntPtr, UIntPtr)

Scrive il valore specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Write<T>(T, T)

Scrive il riferimento a un oggetto specificato nel campo specificato. Nei sistemi in cui è richiesto, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria nel modo seguente: se un'operazione di lettura o di scrittura compare prima di questo metodo nel codice, il processore non potrà spostarla in una posizione successiva al metodo stesso.

Si applica a

Vedi anche