在 const 引用 getter 上读写互斥锁(使用 Qt)

Read write mutex on a const reference getter (using Qt)

我在模型-视图-控制器程序中采用了以下方案:

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();

子模型的 getter 应该 return const 引用,以避免不必要的复制。

是否可以通过某种方式将此功能封装在 getter 中?

const model::submodelA& getSubModA() const{

_submod_a.getQReadWriteLock().lockForRead();
return _submod_a;

}

很明显,这里的问题是我在return之后无法解锁。我正在考虑通过包含一个引用读写锁的局部变量来解决这个问题,这将在它的析构函数中解锁它,但我担心它会以某种方式导致未定义的行为,因为它是 return通过参考编辑。

是否有解决此问题的模式或做法?

你想要的是不可能的。原因:

  1. 您想避免复制。这意味着您确实需要 return 参考或类似的东西。无论如何,这意味着内部存储的对象必须可供调用者使用。
  2. 您想在被调用函数内进行任何锁定。这意味着锁定和解锁必须在您调用的函数内部发生。被调用函数无权访问调用代码。

综上所述,这两个需求是冲突的。您必须在访问受保护的内部数据时持有互斥锁,但同时您希望向调用者提供对该数据的访问权限。

顺便说一句:这不是你的问题,但你可能想知道如何解决这个问题。首先要注意的是,您正在根据不复制的要求进行优化。或者,如果证明(!)是瓶颈,请改为优化复制,例如使用具有不可变主体的 handle/body 习语。此外,我想知道你想通过优化互斥锁的范围来实现什么。这也可能是多线程反模式。