Я использую следующую схему в моей программе Model-View-Controller:
class model{
public
const submodelA& getSubModA() const;
const submodelB& getSubModB() const;
private:
submodelA _submod_a;
submodelA _submod_b;
}
Один поток запишет в подмодели, используя соединения сигнальных слотов. Многие темы будут читать из этих подмоделей.
Поэтому я хотел бы использовать блокировку чтения-записи. Однако я хочу избежать следующего:
...
_model.getSubModA().getQReadWriteLock().lockForRead();
int foo = _model.getSubModA().getFoo();
_model.getSubModA().getQReadWriteLock().unlock();
...
Как видите, это излишне многословно.
Я хотел бы сделать просто
int foo = _model.getSubModA().getFoo();
Получатели подмоделей должны возвращать константные ссылки, чтобы избежать ненужных копий.
Можно ли как-то инкапсулировать эту функцию в геттере?
const model::submodelA& getSubModA() const{
_submod_a.getQReadWriteLock().lockForRead();
return _submod_a;
}
Очевидно, проблема в том, что я не могу разблокировать после возвращения. Я думал о том, чтобы взломать это, включив локальную переменную со ссылкой на блокировку readwrite, которая разблокировала бы ее в деструкторе, но я боюсь, что это может как-то привести к неопределенному поведению, так как оно возвращается по ссылке.
Существуют ли какие-либо модели или практики, которые решают эту проблему?