Leí un tutorial sobre volatile en el lenguaje C, pero todavía no puedo resolverlo. Algunos dicen que el volátil le dice al optimizador del compilador que las operaciones que involucran esta variable no deben optimizarse de ciertas maneras. Esto significa que cada vez que se cambia el valor de una variable en un registro, el valor debería afectar la memoria.
Y también algunos dicen que volátil significa que el valor se puede cambiar por medios fuera de este código.
No puedo entender el segundo dicho. Entonces, ¿la variable volátil se puede cambiar por medios fuera de este código? ¿Cómo? ¿Y estas dos afirmaciones son correctas?
La declaración “el valor se puede cambiar por medios fuera de este código” básicamente significa que otro programa o hardware puede actualizar esa variable. Esto es totalmente posible. Una forma de pensar en esto es relacionar este concepto con un archivo que se comparte entre varios programas. Muchos programas pueden abrir, escribir y leer un archivo a la vez. Cuando lee de un archivo, quiere asegurarse de que está leyendo la última actualización y no la más antigua.
Volviendo a la palabra clave volátil, colocando volátil antes de una variable, en efecto, hace lo mismo. Se asegura de que lo que está leyendo de la variable no se base en la optimización del compilador o en una copia antigua de la variable que tenía su programa. Además, la palabra clave volátil garantiza que la variable se obtenga de la memoria en cada acceso. Por lo tanto, ambas declaraciones son correctas con respecto a la palabra clave volátil.
-
No entiendo como un hardware cambia la variable? ¿Eso significa que el hardware no necesita algún método o código para modificar la variable?
– usuario707549
28/04/2011 a las 17:30
-
@ratzip: Sí. Una variable es una ubicación en la memoria que contiene un valor, y la memoria es solo una pieza de hardware (un chip RAM, por ejemplo). Muchos sistemas informáticos (teclado, red, entrada de audio, etc.) están configurados para que el hardware externo pueda modificar directamente ciertas ubicaciones de memoria.
– e.James
28 de abril de 2011 a las 17:40
Aviraldg
C no es necesariamente para computadoras. Por ejemplo, si está desarrollando para Game Boy Advance, a menudo se encontrará con ubicaciones de memoria modificadas por el hardware, por lo que es posible que no modifique la variable en su código, pero se modifica de todos modos. eso es lo que volatile
medio.
Al agregar el volatile
palabra clave, le estás diciendo al compilador que “El valor almacenado en esta variable (ubicación de memoria) puede cambiar sin mi código haciendo cualquier cosa”.
-
¿Por qué es esto parte del estándar C en lugar de una extensión para esas implementaciones? No hay una forma conforme de obtener una dirección que apunte a la memoria que se comporta de esa manera.
– Aleatorio832
28 de abril de 2011 a las 17:12
-
@Random: Porque así son las cosas. De todos modos, casi todas las plataformas necesitarán interactuar con el hardware en algún momento.
–Oliver Charlesworth
28 de abril de 2011 a las 17:14
-
En ciertas plataformas integradas, como GBA, tiene registros mapeados en la memoria, por lo que sabe con certeza que cierta región en la memoria voluntad comportarse de esa manera.
– Aviraldg
28 de abril de 2011 a las 17:15
-
@Random: ¿Puedes explicar esto? ¿No cree que sea posible indicar a los dispositivos adjuntos que usen ubicaciones de memoria particulares como sus búferes o dónde transmitir las señales recibidas?
– Andrés Lázaro
28 de abril de 2011 a las 17:16
-
@Random: el estándar C no define cómo
#include
s debe ser resuelto, tampoco. Eso no quiere decir que no sean útiles.–Oliver Charlesworth
28 de abril de 2011 a las 17:32
Oliver Charlesworth
Considere cualquiera de los siguientes:
- una aplicación de subprocesos múltiples,
- una aplicación que usa memoria compartida,
- una aplicación que se ejecuta en una plataforma que mapea registros de E/S en el espacio de direcciones,
- una aplicación con DMA de hardware en segundo plano.
En cada una de estas situaciones, la memoria se puede modificar fuera del subproceso actual.
Tenga en cuenta que “cada vez que el valor de una variable cambia en el registro, entonces el valor debería afectar la memoria” es correcto, solo que no muy claro.
-
y también los dos dichos son correctos?
– usuario707549
28 de abril de 2011 a las 17:19
-
pero
volatile
es muy, muy raramente útil para el código de subprocesos múltiples.– chico curioso
26/10/2011 a las 22:53
-
volatile también es útil en el caso de datos que podrían ser modificados por un evento asíncrono, como la ejecución del código del controlador de señales (es decir, el código del controlador de señales modificó la variable).
– vyudh
9 de abril de 2013 a las 2:35
-
No existe ningún requisito en la especificación C de que volátil tenga semántica de adquisición/liberación o cualquier otra semántica que sea realmente útil para el código de subprocesos múltiples. Recuerde, diferentes subprocesos pueden estar operando contra cachés inconsistentes en diferentes procesadores; no hay ningún requisito de que un compilador implemente volatile para tener eso en cuenta. A menos que esté escribiendo código para un compilador específico y sepa qué extensiones del lenguaje C implementa el compilador con respecto a volatile, no debe usar volatile para la semántica de subprocesos.
–Eric Lippert
10 de junio de 2014 a las 16:42
-
@EricLippert: Tampoco existe ningún requisito en el Estándar C de que una implementación conforme sea adecuada para cualquier propósito. El hecho de que el Estándar no requiera que una implementación conforme haga algo no implica de ninguna manera que las implementaciones de calidad destinadas a ser adecuadas para la programación de bajo nivel no deban hacerlo. Desafortunadamente, está de moda que los compiladores traten los problemas de calidad de implementación como una excusa para implementar una semántica de mala calidad.
– Super gato
13 de julio de 2018 a las 22:33
Una ubicación de memoria se puede cambiar fuera del código de un programa de muchas maneras. Por ejemplo, una lectura DMA de un disco puede escribir en un búfer, o un dispositivo asignado a la memoria puede cambiar de ubicación debido a algún evento en el dispositivo.
Flinsch
Esto se dirige, por ejemplo, a aplicaciones de subprocesos múltiples: el valor de una variable puede cambiarse mediante varios subprocesos y, por lo tanto, debe “sincronizarse” con la memoria en cada acceso (independientemente de si se lee o escribe el valor).
-
volatile es muy, muy raramente útil para el código de subprocesos múltiples.
– chico curioso
26/10/2011 a las 22:53
Pedro Mortensen
Declarar una variable volátil significa que está instruyendo al compilador para que no optimice el fragmento de código alrededor de esa variable. Esto es para obligar a la CPU a no para usar el valor de la variable de los registros locales o la memoria caché, pero para obtener el valor de la memoria principal cada vez.
-
volatile es muy, muy raramente útil para el código de subprocesos múltiples.
– chico curioso
26/10/2011 a las 22:53