У меня есть потокобезопасный Document
класс, представляющий пользовательский документ.
У него есть геттеры (функции const) и сеттеры для изменения его состояния.
Все эти функции защищены мьютексом, чтобы гарантировать, что документ не будет изменен
пока метод не будет полностью выполнен.
Но из-за QMutex
использование, я не могу пометить функцию доступа к состоянию
как const
без mutable
использование. Захватив QMutex
изменить это состояние.
Правильно ли этот код или его можно написать более приятным способом?
Без хаки 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 канале об этой теме.
Дело в том, что в C ++ 11 mutable
получил новое значение в отношении безопасности потоков: «этот элемент данных внутренне синхронизирован». Это именно то, что такое мьютекс. Херб даже говорит в этом разговоре, говоря о мьютексе: «он хочет быть изменчивым».
Итак, имея mutable
мьютекс и доступ к нему из const
функция-член совсем не хакерская, и на самом деле это одно из основных предназначений mutable
,