¿No tiene sentido o es malo usar la palabra clave mutable de C++?
No; la palabra clave mutable
es A Good Thing. mutable
se puede utilizar para separar el estado observable de un objeto de los contenidos internos del objeto.
Con el ejemplo de "datos en caché" que describe (un uso muy común de mutable
), permite que la clase realice optimizaciones "debajo de las coberturas" que en realidad no modifican el estado observable.
Con respecto al acceso a un objeto de múltiples hilos, sí, debe tener cuidado. En general, si una clase está diseñada para acceder desde múltiples hilos y tiene variables mutable
, debe sincronizar la modificación de esas variables internamente. Tenga en cuenta, sin embargo, que el problema es realmente más conceptual. Es fácil pensar que:
- Todos mis procesos únicamente llaman métodos constantes en este objeto compartido
- métodos constantes no modifican el objeto sobre el cual son llamados
- Si un objeto no se modifica , no necesito para sincronizar el acceso a la misma
- Por lo tanto, no necesito para sincronizar el acceso a este objeto
este argumento es erróneo debido a que (2) es falsa: métodos constantes de hecho puede modif y miembros de datos mutables. El problema es que es muy, muy fácil pensar que este argumento es correcto.
La solución a este problema no es fácil: efectivamente, solo tiene que ser extremadamente cuidadoso al escribir código multiproceso y estar absolutamente seguro de que comprende cómo se implementan los objetos compartidos entre subprocesos o qué concurrencia garantiza.
Diría que en realidad malinterpretas la palabra clave 'mutable'. ¿De dónde sacaste esta idea de que está destinado a afectar el almacenamiento en caché de datos? –
@Jonathan: el almacenamiento en caché de datos es un uso muy común de los miembros de datos 'mutables'. Si tiene una función de miembro const que realiza alguna tarea costosa y sabe que la función se llama con frecuencia, una optimización típica es introducir un miembro de datos mutable para almacenar en caché los resultados de la costosa tarea para que las llamadas futuras a esa función miembro sean más rápidas . –
Sí, pero ese es un caso de uso, no el significado de la palabra clave. –