. Ho una classe threading protetta Document
che rappresenta un documento personalizzato. Ha getter (funzioni const) e setter per modificare il suo stato. Tutte queste funzioni sono protette da mutex per garantire che il documento non venga modificato finché il metodo non sarà completamente eseguito.È possibile contrassegnare la funzione di mutex-blocco come const
Ma a causa di QMutex
utilizzo, non riesco a segnare la funzione-letta stato come const
senza mutable
utilizzo. Catturare QMutex
cambiare il suo stato.
Questo codice è corretto o può essere scritto in modo più gradevole? senza l'uso di hacky mutable
.
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;
}
Questo uso di 'mutable' non è" hacky "... è esattamente ciò che' mutable' è lì per (ma non esclusivamente - ad esempio i risultati di caching, la strumentazione sono usi ugualmente validi). –
Un altro esempio di 'mutable' potrebbe essere una cache (rappresentazione interna dello stato esterno) che può essere aggiornata alla lettura, quindi anche se una funzione di lettura è const, la cache può cambiare, ma ciò non significa che lo stato di l'oggetto è cambiato. – stefaanv
@TonyD Il mio capo dice qualcosa come "la funzione const non deve cambiare nulla - e il mutex fa parte dello stato del documento, cambiarlo implicitamente è confuso". Dovrei spiegarlo sulla costanza logica e bit a bit? – eraxillan