variable statics que estatica declarar async c# multithreading volatile

statics - ¿Cuál es el propósito de la palabra clave ''volátil'' en C#



variable static c# (6)

¿Cuál es el propósito de la palabra clave volatile en C #?

¿Dónde necesitaría usar esta palabra clave?

Vi la siguiente declaración, pero no puedo entender por qué se requiere volatile aquí.

internal volatile string UserName;



La volatilidad es una sugerencia para el compilador (y el compilador ngen / jit) de que el valor de esta variable puede cambiar en cualquier momento y, por lo tanto, las optimizaciones sobre el acceso a la variable mediante el almacenamiento en caché del valor localmente volátil se deshabilitan.

Considere el siguiente código:

If (UserName == "") // do something If (UserName == "Fred") // do something

Si no estuviera presente volatile, el compilador podría generar IL donde almacena la referencia en la pila para la primera comparación y luego la reutiliza para la segunda. Sin embargo, agregar volatile le dice al compilador que la referencia podría ser cambiada por otro hilo, lo que obliga a generar IL que no reutilizará la copia de la pila desde la primera comparación.


La volatilidad se usa para una variable que puede cambiar sin su acción mientras su código se está ejecutando. Le dice al compilador que escriba el ensamblaje de tal manera que no almacene en caché la variable, sino que, por el contrario, se asegure de leerlo antes de cada uso.

Un ejemplo de algo que sería volátil sería un registro de hardware que su código tiene memoria asignada y está leyendo para determinar cuándo se establece una bandera. El hardware puede establecer el valor mientras se ejecuta su código y, sin utilizar la palabra clave volátil, no notará este cambio, ya que el ensamblaje nunca verificará el valor.


Lo remito a la sección 10.5.3 de la especificación, que establece:

Para los campos no volátiles, las técnicas de optimización que reordenan las instrucciones pueden llevar a resultados inesperados e impredecibles en programas de múltiples subprocesos que acceden a campos sin sincronización, como los que proporciona la declaración de bloqueo (§8.12). Estas optimizaciones pueden ser realizadas por el compilador, por el sistema de tiempo de ejecución o por hardware. Para campos volátiles, tales optimizaciones de reordenación están restringidas:

Una lectura de un campo volátil se llama lectura volátil. Una lectura volátil tiene "adquirir semántica"; es decir, se garantiza que ocurra antes de cualquier referencia a la memoria que ocurra después de esta en la secuencia de instrucciones.

Una escritura de un campo volátil se llama escritura volátil. Una escritura volátil tiene "liberación semántica"; es decir, se garantiza que sucederá después de cualquier referencia de memoria antes de la instrucción de escritura en la secuencia de instrucciones.

Estas restricciones aseguran que todos los subprocesos observarán escrituras volátiles realizadas por cualquier otro subproceso en el orden en que se realizaron. No se requiere una implementación conforme para proporcionar un solo ordenamiento total de escrituras volátiles como se ve desde todos los subprocesos de ejecución.

Léalo muy cuidadosamente si tiene alguna intención de hacer un campo volátil. Si no comprende completamente todas las implicaciones de la semántica volátil, no intente utilizarlas. Por lo general, es mucho mejor usar un bloqueo, que automáticamente le brinda suficientes barreras de memoria para garantizar la adquisición y liberación de la semántica. Recuerde, los bloqueos solo son realmente costosos cuando se disputan.


MSDN resumirá mejor que yo ...

"La palabra clave volátil indica que un campo puede ser modificado por varios subprocesos que se ejecutan al mismo tiempo. Los campos que se declaran volátiles no están sujetos a las optimizaciones del compilador que asumen el acceso de un solo subproceso. Esto asegura que la más actualizada El valor de fecha está presente en el campo en todo momento ".

http://msdn.microsoft.com/en-us/library/x13ttww7(v=VS.100).aspx


No es nada más que decirle al compilador que esta variable cambiará su valor en cualquier momento por medio de cualquier cosa y el compilador no debe hacer ninguna suposición sobre esta variable.

Normalmente, el compilador asumirá que alguna variable será constante durante el tiempo de ejecución. Esto puede provocar un error en la comprobación de un valor de registor repetidamente. Porque el valor de registro puede ser cambiado por cualquier cosa. Por lo tanto, para este tipo de variables se debe declarar ''volátil'' y se debe verificar cada vez que aparezca en el código sin ninguna suposición.