la palabra clave volátil en lenguaje C? [duplicate]

6 minutos de lectura

Tengo una pregunta sobre volatile en lenguaje C.

Leí un tutorial pero aún no puedo entenderlo, algunos dicen que el volátil le dice al optimizador del compilador que las operaciones que involucran esta variable no deben optimizarse de cierta manera. esto significa que cada vez que el valor de una variable cambia en el registro, entonces 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 estos dos dicen que ambos tienen razón?

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

avatar de usuario
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 #includes debe ser resuelto, tampoco. Eso no quiere decir que no sean útiles.

    –Oliver Charlesworth

    28 de abril de 2011 a las 17:32

avatar de usuario
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.

esto aborda, por ejemplo, aplicaciones de subprocesos múltiples: el valor de una variable puede ser cambiado por varios subprocesos y, por lo tanto, debe “sincronizarse” con la memoria en cada acceso (independientemente de si leer o escribir 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

avatar de usuario
usuario2212525

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 usar el valor de la variable de los registros locales o la memoria caché, sino a buscar 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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad