Volatile Clase

Definición

Contiene métodos para realizar operaciones de memoria volátil.

public ref class Volatile abstract sealed
public static class Volatile
type Volatile = class
Public Class Volatile
Herencia
Volatile

Comentarios

En un sistema multiprocesador, debido a las optimizaciones de rendimiento en el compilador o procesador, es posible que parezca que las operaciones de memoria normales se reordenan cuando varios procesadores funcionan en la misma memoria. Las operaciones de memoria volátil impiden determinados tipos de reordenación con respecto a la operación. Una operación de escritura volátil impide que las operaciones de memoria anteriores en el subproceso se reordene para que se produzcan después de la escritura volátil. Una operación de lectura volátil impide que las operaciones de memoria posteriores en el subproceso se reordenen para que se produzcan antes de la lectura volátil. Estas operaciones pueden implicar barreras de memoria en algunos procesadores, lo que puede afectar al rendimiento.

Por ejemplo, considere el siguiente escenario con dos subprocesos y dos Int32 campos x y y que son inicialmente cero:

Subproceso 1 Subproceso 2
x = 1; int y2 = Volatile.Read(ref y);
Volatile.Write(ref y, 1); int x2 = x;

La lectura volátil y la escritura impiden la reordenación de las dos operaciones dentro de cada subproceso, como por el compilador o por el procesador. Independientemente del orden en el que estas operaciones se produzcan realmente en un subproceso relativo al otro subproceso, incluso en un sistema de varios procesadores donde los subprocesos pueden ejecutarse en distintos procesadores, las operaciones volátiles garantizan que el subproceso 2 no vería y2 == 1 y x2 == 0. En el subproceso 1, la escritura x en debe aparecer antes de que la escritura volátil en yy, en el subproceso 2, la lectura de x debe aparecer después de la lectura volátil de y. Por lo tanto, si el subproceso 2 ve y2 == 1, también debe ver x2 == 1.

Sin embargo, tenga en cuenta el mismo escenario anterior con una secuencia específica en la que se producen las operaciones:

Secuencia Subproceso 1 Subproceso 2
1 x = 1; ...
2 Volatile.Write(ref y, 1); ...
3 ... int y2 = Volatile.Read(ref y);
4 ... int x2 = x;

Aunque la escritura volátil en y en el subproceso 1 se produjo antes de la lectura volátil de y en el subproceso 2, es posible que el subproceso 2 siga viendo y2 == 0. La escritura volátil en y no garantiza que una lectura volátil siguiente de y en un procesador diferente verá el valor actualizado.

Note

  • Las lecturas y escrituras volátiles garantizan que un valor se lee o escribe en la memoria y no se almacena en caché (por ejemplo, en un registro de procesador). Por lo tanto, puede usar estas operaciones para sincronizar el acceso a un campo que otro subproceso o hardware puede actualizar.
  • La Volatile clase también proporciona operaciones de lectura y escritura para algunos tipos de 64 bits, como Int64 y Double. Las lecturas y escrituras volátiles en dicha memoria de 64 bits son atómicas incluso en procesadores de 32 bits, a diferencia de las lecturas y escrituras normales.

Las operaciones de memoria volátil son para casos especiales de sincronización, donde el bloqueo normal no es una alternativa aceptable. En circunstancias normales, la instrucción /> de C# y la clase proporcionan la forma más sencilla y menos propensa a errores de sincronizar el acceso a los datos y la clase proporciona una manera sencilla de escribir código de inicialización diferida sin usar directamente el bloqueo de doble comprobación.

Los Volatile.Read métodos y Volatile.Write habilitan la funcionalidad que no se admite en los lenguajes. Por ejemplo:

  • Algunos lenguajes, como Visual Basic, no reconocen el concepto de operaciones de memoria volátil. La Volatile clase proporciona esa funcionalidad en estos lenguajes.

    Note

    Llamar a uno de estos métodos afecta solo a un solo acceso a memoria. Para proporcionar una sincronización eficaz para un campo, todo el acceso al campo debe usar Volatile.Read y Volatile.Write.

  • En C#, el uso del volatile modificador en un campo garantiza que cada acceso a ese campo sea una operación de memoria volátil, pero el volatile modificador no se puede aplicar a los elementos de matriz. Los Volatile.Read métodos y Volatile.Write se pueden usar en elementos de matriz.

Métodos

Nombre Description
Read(Boolean)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(Byte)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(Double)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(Int16)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(Int32)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(Int64)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(IntPtr)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(SByte)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(Single)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(UInt16)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(UInt32)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(UInt64)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read(UIntPtr)

Lee el valor del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Read<T>(T)

Lee la referencia de objeto del campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: Si aparece una lectura o escritura después de este método en el código, el procesador no puede moverlo antes de este método.

Write(Boolean, Boolean)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(Byte, Byte)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(Double, Double)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(Int16, Int16)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(Int32, Int32)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(Int64, Int64)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(IntPtr, IntPtr)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(SByte, SByte)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(Single, Single)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(UInt16, UInt16)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(UInt32, UInt32)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(UInt64, UInt64)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write(UIntPtr, UIntPtr)

Escribe el valor especificado en el campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Write<T>(T, T)

Escribe la referencia de objeto especificada al campo especificado. En los sistemas que lo requieren, inserta una barrera de memoria que impide que el procesador reordene las operaciones de memoria de la siguiente manera: si aparece una lectura o escritura antes de este método en el código, el procesador no puede moverla después de este método.

Se aplica a

Consulte también