Puntero de liberación (vfree-ing) a datos volátiles
-
26-10-2019 - |
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 vfree
en 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í?
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:
- Llame a la losa/el sobre para liberar la memoria
- Eliminar la asignación de memoria
Entonces sí, lanzar a un void *
No causará ningún daño en el tiempo de ejecución.