Подтвердить что ты не робот

Может ли функция блокировки мьютекса отмечена как 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;
}
4b9b3361

Ответ 1

Herb Sutter имеет отличный разговор на Channel9 об этой теме.

Здесь важно указать, что в С++ 11 mutable получила новое значение в отношении безопасности потоков: "этот элемент данных внутренне синхронизирован". Именно это и есть мьютекс. Херб даже говорит в этом разговоре, говоря о мьютеке: "он хочет быть изменчивым".

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