在常量引用获取器上读取写入互斥锁(使用 Qt)

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

本文关键字:使用 Qt 引用 常量 获取 读取      更新时间:2023-10-16

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

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 应返回 const 引用,例如避免不必要的副本。

是否可以以某种方式将此功能封装在吸气器中?

const model::submodelA& getSubModA() const{
_submod_a.getQReadWriteLock().lockForRead();
return _submod_a;
}

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

是否有任何模式或实践可以解决此问题?

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

  1. 您希望避免复制。这意味着确实,您需要返回引用或类似的东西。在任何情况下,这意味着内部存储的对象必须可供调用方使用。
  2. 您希望在被调用的函数内执行任何锁定。这意味着锁定和解锁必须在您调用的函数内进行。被调用函数无权访问调用代码。

总之,这两个要求是冲突的。在访问受保护的内部数据时,必须持有互斥锁,但同时希望向调用方提供对该数据的访问权限。

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