2011-08-03 11 views

Respuesta

16

The article mentioned in this blog post por Herb Sutter explica las cosas de manera concisa y clara y compara el uso y el significado de volátiles en C, C++, Java y C#.

Hay un par de buenas preguntas y respuestas sobre este mismo sitio también:

EDITAR: para no confundir a nadie aquí es el "exact link" al artículo DDJ mencionado en el enlace inicial (que es un enlace al blog de Herb Sutter).

También this article por Nigel Jones explica la palabra clave volátil en el contexto de la programación C incrustada. Como esta pregunta parece haber aparecido en una entrevista this other article por el mismo autor es uno de mis favoritos ("exact link") y tiene otra buena explicación de la volatilidad en el mundo C.

+0

siguiendo su enlace no pude entender la diferencia –

+1

@Luis Filipe ¿qué es exactamente lo que no entendió? Solo para resumir lo que presenta el artículo: en Java/.NET (C#) volátil se usa para programación sin bloqueo mientras que en C/C++ se usa para "Semántica de memoria inusual" (describiendo registros HW, memoria en más de una dirección) – celavek

+0

Usted tiene que seguir hasta el artículo real ddj. No sé si eso es fácil de vincular a (anuncios). –

2

En C volátil le dice al compilador que no optimizar el acceso a una variable:

int running = 1; 
void run() { 
    while (running) { 
     // Do something, but 'running' is not used at all within the loop. 
    } 
} 

Normalmente, el compilador puede traducir 'mientras que (en ejecución)' en este caso simplemente 'while (1)'. Cuando la variable 'en ejecución' se marca como volátil, el compilador se ve obligado a verificar la variable cada vez.

Importante es comprender que para C 'volátil' solo se limita la optimización del compilador, mientras que su hardware (es decir, los cachés de la CPU, la línea de instrucciones, etc.) aún puede reordenar el acceso a la memoria. No hay forma de que su compilador C le diga a su hardware que no se optimice. Tienes que hacerlo tú mismo (por ejemplo, usando una barrera de memoria).

Por lo que yo sé (pero no estoy completamente seguro) C# especificación va un poco más lejos:

  • Si se escribe a una variable volátil, se garantiza que todos los accesos a memoria que se hacer antes de que se complete.
  • Si lee de una variable volátil, se garantiza que todos los accesos de memoria que realice después no se completen antes de que se complete la lectura de la variable volátil.
Cuestiones relacionadas