Volatile Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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#
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
volatilemodificador en un campo garantiza que cada acceso a ese campo sea una operación de memoria volátil, pero elvolatilemodificador 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. |