2014-08-27 8 views
13

Ich habe thread-sichere Document Klasse für benutzerdefinierte Dokument. Es hat getters (const functions) und Setter ihren Zustand zu ändern. Alle diese Funktionen sind mutex-geschützt, um zu garantieren, dass das Dokument nicht geändert wird bis die Methode vollständig ausgeführt wird.Kann Mutex-Locking-Funktion als const markiert werden

Aber aufgrund QMutex Nutzung, ich kann nicht staatlich zugegriffen Funktion als const ohne mutable Nutzung markieren. Capturing QMutex ändern Sie den Status.

Ist dieser Code korrekt, oder kann er auf eine schönere Art und Weise geschrieben werden? Ohne hacky mutable Verwendung.

class Document 
{ 
    // This method should be const: it changes only mutex 
    // and don't touch document state 
    bool IsCorrect() const; 
    ... 
    mutable QMutex m_lock; 
}; 

bool Document::IsCorrect() const 
{ 
    // Capturing mutex object change it! 
    QMutexLocker lock(&m_lock); 
    ... Const-aware code 
    bool result = (m_context != NULL); 
    ... 
    return result; 
} 
+9

Diese Verwendung von "veränderbar" ist nicht "hacky" ... es ist genau das, was "veränderbar" für (aber nicht ausschließlich) ist - z.B. Caching-Ergebnisse, Instrumentierung sind gleichermaßen gültige Verwendungen). –

+0

Ein anderes Beispiel für "mutable" könnte ein Cache (interne Repräsentation des externen Zustands) sein, der beim Auslesen aktualisiert werden kann. Selbst wenn eine Lesefunktion const ist, kann sich der Cache ändern, aber das bedeutet nicht, dass der Status von das Objekt hat sich geändert. – stefaanv

+0

@TonyD Mein Chef sagt etwas wie "const-Funktion darf nichts ändern - und Mutex ist ein Teil des Dokument-Status, Änderungen implizit ist verwirrend". Soll ich ihm über logische und bitweise Konstanz erklären? – eraxillan

Antwort

18

Herb Sutter hat eine ausgezeichnete talk on Channel9 zu diesem Thema.

Der hier relevante Punkt ist, dass in C++ 11, mutable eine neue Bedeutung in Bezug auf Thread-Sicherheit gewonnen hat: "Dieses Datenelement ist intern synchronisiert." Genau das ist ein Mutex. Herb sagt sogar in diesem Vortrag, wenn er über einen Mutex spricht: "Er möchte veränderbar sein."

So einen mutable Mutex hat und es von einer const Elementfunktion Zugriff ist überhaupt nicht hacky, und es ist in der Tat einer der primären beabsichtigten Verwendungen für mutable.

+0

Ok, ich bin Ruhe jetzt Allerdings finde ich Mutex-basierte Design ist nicht die beste., Aber das ist eine andere Frage. – eraxillan

Verwandte Themen