Можете ли вы подумать о элегантном способе создания (member-) функций с помощью дополнительного мьютекс-шкафчика?Давайте проигнорируем макросы по понятным причинам.
Конечно, самый простой способ сделать это, имея две функции:
int getIndex() const { std::lock_guard m( mtx ); return nm_getIndex(); }
int nm_getIndex() const { return _index; }
Это создает эффективный код, но основывается на дублировании кода.,По сути, вы получите два объявления функций дважды.
Другим способом было бы превратить их в функции шаблонов.Аргумент логического шаблона будет функционировать как «en- / disabler».Затем вы можете вызывать функцию следующим образом:
auto index = getIndex< NoMutex >();
всякий раз, когда используете функцию для внутреннего использования (и в противном случае блокируете мьютекс).Проблема здесь состоит в том, чтобы убедиться, что мьютекс разблокирован, даже когда выдается исключение.То есть вы не можете просто использовать что-то вроде
if constexpr( MutexOn == true ) {
mutex.lock();
}
do some stuff;
if constexpr( MutexOn == true ) {
mutex.unlock();
}
Единственное, о чем я сейчас могу думать, - это создать класс вокруг мьютекса и объединить его в объединение.Затем класс может либо «сыграть в lock_guard», либо ничего не делать.Хотя я почти уверен, что это будет правильно оптимизировано в коде релиза, он все равно выглядит громоздким и негибким.Поэтому мне интересно, можете ли вы придумать что-нибудь получше?
Спасибо!