2014-08-27 10 views
13

. 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; 
} 
+9

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). –

+0

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

+0

@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

risposta

18

Herb Sutter ha un eccellente talk on Channel9 su questo argomento.

Il punto rilevante qui è che in C++ 11, mutable ha acquisito un nuovo significato per quanto riguarda la sicurezza del thread: "questo membro dati è sincronizzato internamente". Questo è esattamente ciò che è un mutex. Herb dice anche in quel discorso quando parla di un mutex: "vuole essere mutabile".

Quindi avere un mutex mutable e accedervi da una funzione const membro non è hacky affatto, ed è in effetti una delle principali previste per mutable.

+0

Ok, sono calma ora Tuttavia, trovo che il design basato su mutex non sia il migliore, ma questa è un'altra domanda. – eraxillan

Problemi correlati