2012-05-11 21 views
6

vi esto en una parte que nunca se llama en el código de un compañero de trabajo:¿Qué significa while (! Volátil); ¿hacer?

volatile unsigned char vol_flag = 0; 
// ... 
while(!vol_flag); 

vol_flag se declara en el archivo de cabecera, pero nunca se cambia. ¿Estoy en lo correcto al decir que esto llevará al programa a un ciclo infinito? ¿Hay alguna manera de salir de eso?

+2

Parece un bloqueo de giro mal hecho en código de subprocesos múltiples. –

+1

Tal vez es para la depuración? – animaonline

+2

Este tipo de código se encuentra generalmente en programas para microcontroladores. – alexander

Respuesta

16

Por lo general, un código como este indica que vol_flag se espera que se modifique externamente en algún momento. Aquí, externamente puede significar un hilo diferente, un manejador de interrupciones, una pieza de hardware (en el caso de una IO mapeada en memoria) etc. Este ciclo efectivamente espera el evento externo que cambia el indicador.

La palabra clave volatile es una forma para que el programador exprese el hecho de que no es seguro asumir lo que es aparente del código: es decir, que el indicador no se cambia en el ciclo. Por lo tanto, evita que el compilador realice optimizaciones que podrían comprometer las intenciones detrás del código. En cambio, el compilador se ve obligado a hacer una referencia de memoria para recuperar el valor de la bandera.

Tenga en cuenta que (a diferencia de Java) volatile en C/C++ no establece sucede antes relación y no garantiza ningún pedido o la visibilidad de las referencias de memoria a través de acceso volátil. Además, no asegura la atomicidad de las referencias variables. Por lo tanto, no es una herramienta para la comunicación entre hilos. Ver this para más detalles.