2010-02-19 8 views
6

Por lo que entiendo, el modificador 'volátil' en C# tiene dos efectos:Ejemplo de 'volátil' que impide una optimización del compilador en C#?

  1. Insertos cercas como sea necesario para el procesador de destino
  2. previene ciertos optimizaciones del compilador

En x86/amd64, (1) es irrelevante. Esos procesadores no requieren vallas para la semántica volátil. (ia64 es diferente, sin embargo)

Por lo tanto, estamos a (2). Pero, para los ejemplos que probé, volátil no hace ninguna diferencia en el conjunto jit-ted.

Mi pregunta es: ¿Puede dar un ejemplo de un ejemplo de código C# donde agregar un modificador 'volátil' en un campo da como resultado un código de ensamblado diferente jit-ted?

Respuesta

2

Tal vez this es lo que estás buscando.

+0

Impresionante, ¡eso es exactamente lo que estaba buscando! Aquí, volátil realmente da como resultado diferentes códigos de ensamblaje. –

+0

En caso de que alguien tenga curiosidad, sin un modificador volátil, el valor del campo se almacena en caché en un registro. Y, cuando el valor está en un registro, el núcleo de bucle nunca 'notará' la actualización hecha por otro núcleo. –

1

Marc Gravell tiene un repeatable example de cómo la falta de una palabra clave volátil puede causar problemas.

También se discutió here.

Vale la pena señalar (como lo hace Marc) que las optimizaciones del compilador solo se ven cuando se compilan en el modo de lanzamiento.

Cuestiones relacionadas