С++ мьютекс и константная корректность
Существует ли соглашение о том, когда метод, который по существу доступен только для чтения, но имеет mutex/lock, который может потребоваться изменить, является константой или нет?
если его нет, будет недостаток/плохой дизайн, если такой метод const
Спасибо
Ответы
Ответ 1
Вы можете пометить членов данных с помощью ключевого слова mutable
, чтобы они могли быть изменены в константной функции-члене, например:
struct foo
{
mutable mutex foo_mutex;
// ....
void bar() const
{
auto_locker lock(foo_mutex);
// ...
}
};
Постарайтесь сделать это как можно меньше, потому что злоупотребление mutable
является злым.
Ответ 2
Я обычно в порядке с mutable
блокировками и кэшами для концептуально const
.
Особенно в случае кэширования результата вычисления производительности. Это строго деталь реализации, которая не должна беспокоить вызывающих, поэтому удаление обозначения const
было бы равносильно небольшой утечке в абстракции.
С помощью блокировок я задал себе вопрос, является ли блокировка только частным элементом реализации. Если блокировка используется совместно с другими объектами, то она фактически является частью интерфейса.
На некоторых платформах доступ к замкам осуществляется с помощью дескрипторов, поэтому вы можете использовать const
для метода, не беспокоясь о mutable
.