2010-07-13 15 views
27

¿Hay alguna convención con respecto a cualquier método que sea esencialmente de solo lectura, pero que tenga mutex/lock que pueda necesitar ser modificado, sea const o no?C++ mutex y const correctness

si no hay uno, lo que sería inconveniente/mal diseño si tal método es const

Gracias

+0

Yo diría que depende de la semántica de la clase: en diferentes casos, diferentes enfoques pueden tener sentido. –

+0

¿Por qué no quieres que sea const? –

+0

@Neil Tengo la impresión de que debe evitarse mutable, pero parece que mutex es un buen candidato para usarlo, así que quería saber si está bien diseño – Anycorn

Respuesta

41

Puede marcar miembros de datos con la palabra clave mutable para que puedan ser modificados en una constante función miembro, por ejemplo:

struct foo 
{ 
    mutable mutex foo_mutex; 
    // .... 
    void bar() const 
    { 
     auto_locker lock(foo_mutex); 
     // ... 
    } 
}; 

tratar de hacer esto lo menos posible, porque abusar mutable es malo.

+2

gracias. Supongo que la pregunta es realmente sobre el diseño en lugar de cómo implementar – Anycorn

+0

aaa @ marcar a los miembros de datos mutex como mutables es una de las veces es una especie de caso de uso aceptable porque no representa el estado real del objeto. –

+1

En nuestro producto, esta palabra clave se usa tres veces y una de las tres es exactamente 'mutable boost :: mutex'. Algún día averiguaré cómo deshacerme de los otros dos. – Cubbi

11

Estoy generalmente bien con mutable bloqueos y cachés para los métodos que son conceptualmente const.

Especialmente en el caso del almacenamiento en caché el resultado de un cálculo de rendimiento. Eso es estrictamente un detalle de implementación que no debería preocupar a las personas que llaman, por lo que eliminar la designación const equivaldría a una pequeña fuga en la abstracción.

Con bloqueos, me pregunto si el bloqueo es solo un detalle de implementación privada. Si el bloqueo se comparte con otros objetos, entonces en realidad es parte de la interfaz.

En algunas plataformas, se accede a los bloqueos a través de los controladores, por lo que puede usar const en el método sin preocuparse por mutable.