Может ли функция блокировки мьютекса отмечена как const
У меня есть потокобезопасный класс Document
, представляющий пользовательский документ.
У этого есть геттеры (функции const) и сеттеры, чтобы изменить его состояние.
Все эти функции защищены мьютексом, чтобы гарантировать, что документ не будет изменен
пока метод не будет полностью выполнен.
Но из-за использования QMutex
я не могу отметить функцию, доступную для состояния
как const
без использования mutable
. Захват QMutex
изменит его состояние.
Правильно ли этот код, или он может быть написан более приятным образом?
Без использования 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;
}
Ответы
Ответ 1
Herb Sutter имеет отличный разговор на Channel9 об этой теме.
Здесь важно указать, что в С++ 11 mutable
получила новое значение в отношении безопасности потоков: "этот элемент данных внутренне синхронизирован". Именно это и есть мьютекс. Херб даже говорит в этом разговоре, говоря о мьютеке: "он хочет быть изменчивым".
Таким образом, наличие мьютекса mutable
и доступ к нему из функции-члена const
вообще не хаки, и это фактически одно из основных предназначенных для использования mutable
.