在常量引用获取器上读取写入互斥锁(使用 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 应返回 const 引用,例如避免不必要的副本。
是否可以以某种方式将此功能封装在吸气器中?
const model::submodelA& getSubModA() const{
_submod_a.getQReadWriteLock().lockForRead();
return _submod_a;
}
显然,这里的问题是我无法在返回后解锁。我正在考虑通过包含一个引用读写锁的局部变量来解决这个问题,这将在其析构函数中解锁它,但我担心它会以某种方式导致未定义的行为,因为它是通过引用返回的。
是否有任何模式或实践可以解决此问题?
你想要的是不可能的。原因:
- 您希望避免复制。这意味着确实,您需要返回引用或类似的东西。在任何情况下,这意味着内部存储的对象必须可供调用方使用。
- 您希望在被调用的函数内执行任何锁定。这意味着锁定和解锁必须在您调用的函数内进行。被调用函数无权访问调用代码。
总之,这两个要求是冲突的。在访问受保护的内部数据时,必须持有互斥锁,但同时希望向调用方提供对该数据的访问权限。
顺便说一句:这不是你的问题,但你可能会想知道如何解决这个问题。首先要注意的是,您正在根据不复制的要求进行优化。或者,如果证明 (!) 是一个瓶颈,请改为优化复制,例如,将句柄/正文习惯用法与不可变主体一起使用。此外,我想知道您想通过优化互斥锁的范围来实现什么。这也可能是多线程反模式。
相关文章:
- 使用Qt C++计算类似Git的SHA1哈希
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 使用Qt框架在c ++类中创建API调用
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 无法使用 Qt 15.3.1 进行远程调试时加载 qtcreatorcdbext.dll
- 使用 Qt 解析 JSON 数组
- 当QProcess需要用户使用Qt输入时,如何阅读
- 如何使用Qt发送REST调用?
- 如何使用QT创建器获取网页源代码?
- 如何使用MSVC 2019创建和使用Qt 5.14.0自定义小工具插件
- 模拟GPS数据,以便使用Qt与Traccar一起使用
- 如何使用Qt自动捕获窗口
- 使用 QT 逐行读取 JSON
- 如何使用Qt在新窗口中显示视频帧
- 如何使用Qt删除单词中的表行
- 使用 Qt 测量过程的实际运行时间
- 我可以在不使用Qt for Webassembly的情况下使用Emscripten编译Qt吗?
- 使用 Qt 解析 GLTF 缓冲区
- 使用 Qt 运行 Windows PowerShell 命令
- 如何使用Qt QSqlDriver::subscribeToNotification with SQLite3?