Pregunta

volatile Parece ser una pregunta interminable de cada uno. Pensé que sabía todo al respecto, pero luego me encontré con esto:

Entonces, tengo una memoria compartida entre hilos y lo definí así:

volatile type *name;

Si te hace sentir mejor, puedes imaginar type es solo un int.

Esto significa que tengo un puntero (que no es volátil) a algunos datos que son volátiles. Entonces, por ejemplo, cuando se trata de optimizar, el compilador puede almacenar en caché el valor de name pero no name[0]. ¿Estoy en lo cierto?

Entonces, ahora lo soy vfreeen este puntero (está en un módulo de núcleo de Linux) y me dice que vfree esperanza const void * Mientras lo paso volatile type *.

Entiendo cómo puede ser peligroso pasar un volatile type * como un type * Porque en esa función, los valores de name[i] podría almacenarse en caché (como resultado de la optimización) que no es deseable.

Sin embargo, no entiendo por qué vfree espera que le envíe un puntero necesariamente a datos no volátiles. ¿Hay algo que me falta ahí? O son solo los chicos quienes escribieron vfree ¿No piensas en esta situación?

Supongo que simplemente lanza mi puntero a void * No causaría ningún daño, ¿es así?

¿Fue útil?

Solución 2

Mi conclusión fue que solo lanzar el puntero a void * no causaría un problema y el hecho de que free y vfree No acepte directamente consejos para volatile Los datos son solo algo que se pasó por alto.

Otros consejos

los vfree La función (y cada función de desacoplación sensata en general) no se preocupa por sus datos reales (ya sea volatile O no). Solo espera un puntero (válido) (piense: pasar el puntero como un long valor en un registro de CPU).

Basado en ese valor, la función:

  1. Llame a la losa/el sobre para liberar la memoria
  2. Eliminar la asignación de memoria

Entonces sí, lanzar a un void * No causará ningún daño en el tiempo de ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top