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

С++ мьютекс и константная корректность

Существует ли соглашение о том, когда метод, который по существу доступен только для чтения, но имеет mutex/lock, который может потребоваться изменить, является константой или нет?

если его нет, будет недостаток/плохой дизайн, если такой метод const

Спасибо

4b9b3361

Ответ 1

Вы можете пометить членов данных с помощью ключевого слова mutable, чтобы они могли быть изменены в константной функции-члене, например:

struct foo 
{
    mutable mutex foo_mutex;
    // ....
    void bar() const
    {
        auto_locker lock(foo_mutex);
        // ...
    }
};

Постарайтесь сделать это как можно меньше, потому что злоупотребление mutable является злым.

Ответ 2

Я обычно в порядке с mutable блокировками и кэшами для концептуально const.

Особенно в случае кэширования результата вычисления производительности. Это строго деталь реализации, которая не должна беспокоить вызывающих, поэтому удаление обозначения const было бы равносильно небольшой утечке в абстракции.

С помощью блокировок я задал себе вопрос, является ли блокировка только частным элементом реализации. Если блокировка используется совместно с другими объектами, то она фактически является частью интерфейса.

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