Может ли функция блокировки мьютекса быть помечена как const?

У меня есть потокобезопасный 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;
}

13

Решение

Херб Саттер имеет отличный говорить на 9 канале об этой теме.

Дело в том, что в C ++ 11 mutable получил новое значение в отношении безопасности потоков: «этот элемент данных внутренне синхронизирован». Это именно то, что такое мьютекс. Херб даже говорит в этом разговоре, говоря о мьютексе: «он хочет быть изменчивым».

Итак, имея mutable мьютекс и доступ к нему из const функция-член совсем не хакерская, и на самом деле это одно из основных предназначений mutable,

18

Другие решения


По вопросам рекламы [email protected]