la palabra clave volátil en el lenguaje C?

Tengo una pregunta sobre volátil en el lenguaje C.

Leí un tutorial pero todavía no puedo entenderlo, algunos dicen que el volátil le dice al optimizador de comstackdor que las operaciones que involucran esta variable no deben optimizarse de ciertas maneras. esto significa que cada vez que el valor de una variable cambie en el registro, entonces el valor debería afectar la memoria.

Y también algunos dicen que volátil significa que el valor puede cambiarse fuera de este código.

No puedo entender el segundo dicho, por lo que la variable volátil se puede cambiar por medios externos a este código. ¿cómo? y son estos dos dice que ambos ¿verdad?

La afirmación “el valor puede cambiarse por medios externos a este código” básicamente significa que otro progtwig o hardware puede actualizar esa variable. Esto es totalmente posible. Una forma de pensar en esto es relacionando este concepto con un archivo que se comparte entre múltiples progtwigs. Un archivo puede ser abierto, escrito y leído por muchos progtwigs a la vez. Cuando lee 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, colocar volátil antes de una variable, en efecto, hace lo mismo. Se asegura de que lo que está leyendo de la variable no esté basado en la optimización del comstackdor o en una copia anterior de la variable que tenía su progtwig. Además, la palabra clave volátil asegura que la variable se recupera de la memoria en cada acceso. Por lo tanto, ambas declaraciones son correctas con respecto a la palabra clave volátil.

C no es necesariamente para computadoras. Por ejemplo, si está desarrollando para Game Boy Advance, a menudo se encuentra 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 significa volatile .

Al agregar la palabra clave volatile , le está diciendo al comstackdor que “El valor almacenado en esta variable (ubicación de la memoria) podría cambiar sin que mi código haga nada”.

Considere cualquiera de los siguientes:

  • una aplicación multiproceso,
  • 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 puede alterarse fuera del hilo actual.

Tenga en cuenta que ” cada vez que el valor de una variable cambie en el registro, entonces el valor debería afectar a la memoria ” es correcto, simplemente no muy claro.

Una ubicación de memoria se puede cambiar fuera del código de un progtwig en una gran cantidad de formas. Por ejemplo, una lectura DMA desde un disco puede escribir en un búfer, o un dispositivo asignado en la memoria puede cambiar una ubicación debido a algún evento en el dispositivo.

esto aborda, por ejemplo, las aplicaciones de subprocesamiento múltiple: el valor de una variable puede cambiarse por varios subprocesos y, por lo tanto, tiene que estar “sincronizado” con la memoria en cada acceso (independientemente de si leer o escribir el valor).

Declarar una variable volátil significa que está ordenando al comstackdor que no optimice el fragmento de código alrededor de esa variable. Esto es para obligar a la CPU a NO utilizar el valor de la variable de los registros locales o la memoria caché, pero para obtener el valor de la memoria principal en todo momento.