gpt4 book ai didi

c++ - 关系应用程序数据的并发更新

转载 作者:行者123 更新时间:2023-11-30 02:39:37 26 4
gpt4 key购买 nike

我们有一个 Qt C++ Gui 应用程序,它基本上是一个终端到服务器 (TCP) 软件控制它并显示它的数据。

问题是来自服务器的数据是高度相关的数据。在 SQL 术语中,它将是 ~10-15 个表,所有表都通过一些外键互连

此数据由服务器更新,并且必须(同时)由 GUI 显示。

当前的解决方案是我们将所有数据(基本上)存储在具有适当锁定(读/写)的映射和结构中,以避免并发访问问题。

我们现在面临的问题是该解决方案的扩展性不是很好。应用程序的性能(点击屏幕延迟时发生的事情)变得更糟。

在应用程序中使用关系数据库系统(如带有内存数据库的 sqlite)会有帮助吗?使用数据库(在查询时解决关系依赖性)是否比使用结构映射(在插入期间解决关系依赖性)更好?

我希望我的问题尽可能清楚。

问候,安德烈


更清楚地说:这是因为 GUI 不再响应,因为来自服务器的许多更新锁定了数据结构。

最佳答案

(基于说明实际问题的更新评论,UI 线程阻塞)

这里有两个简单的修复可以提供帮助。第一个问题是在锁定共享数据结构之前预处理所有传入数据。例如,如果您在映射中有 std::string,请不要将 const char* 转换为 std::string锁定在 map 上。这将在暂停 UI 线程时调用 strlen。相反,先转换然后锁定 map 。

第二个改进是锁定 GUI 的时间更短。如果更新可以分成多个较小的部分,请重复获取和释放锁。这将意味着实际更新速度较慢,但​​ UI 响应速度更快。

一个更复杂的策略(如果分区不可能)是暂存。在新映射中创建所有新条目,然后合并两个映射。这基本上是对类固醇的预处理,因为您现在还要对新条目进行排序。(我希望您与服务器交换差异,而不是每次都完全刷新数据!)

关于c++ - 关系应用程序数据的并发更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29603052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com