这种线程间通信的方法安全吗?

2024-01-04

我有3个对象(继承自QObject)每个都包含一个单独的std::list。每个对象都是在主 gui 线程(没有父线程)中创建的,然后被推送到它自己的线程(使用 Qt 的QObject::moveToThread()).

每个线程都连接到一个 GUI,并在不同线程之间发送带有数据的消息。每个线程本质上都是处理它自己的列表。例如:

对象 1:数据消费者。它会弹出列表的前面(如果存在数据)以供使用。它还有一个可用的 SLOT,以便其他线程可以将数据推送到它。没有其他对象可以直接访问该列表,只有原始的 QObject 类。

目标 2:数据的生产者。它将数据推送到其列表。它有可供其他人“ping”它以获取数据的插槽,而这些数据又会发出从其列表中弹出数据的信号。没有其他对象可以直接访问该列表。

Obj 3:为 obj 1 生成数据并使用来自 obj 2 的数据。它有自己的内部数据结构,用于跟踪发送到 obj 1 的数据和来自 obj 2 的数据。它最终会将两个数据集推送到某个对象QwtPlots在进行一些分析之后。

Obj 的 1 和 2 是实时关键的,并使用 QueryPerformanceCounter 风格的“计时”,这实际上会在它们运行时消耗 CPU。他们跑QCoreApplication::processEvents()每个循环都处理发生的事件。

这是处理跨线程数据共享的好方法吗?如果不是,漏洞在哪里?您将如何纠正它们?我知道这会创建大量的数据“副本”,但此时内存膨胀并不是问题。

提前致谢 :)


如果没有所有实现细节,很难确切地说它是否是线程安全的,因为使用线程时有很多事情可能会出错。

对象 1:数据消费者。它会弹出列表的前面(如果存在数据)以供使用。它还有一个可用的 SLOT,以便其他线程可以将数据推送到它。没有其他对象可以直接访问该列表,只有原始的 QObject 类。

如果此槽使用排队或自动连接类型连接到其他线程(例如 Obj 3)中的信号,则 Obj 1 可能是安全的。如果直接从其他线程调用该插槽,那么它显然不是线程安全的,除非您显式同步所有内容。

目标 2:数据的生产者。它将数据推送到其列表。它有可供其他人“ping”它以获取数据的插槽,而这些数据又会发出从其列表中弹出数据的信号。没有其他对象可以直接访问该列表。

您没有提到“ping”是如何实现的或者哪些线程调用这些插槽。如果其他线程直接调用它们,并且 ping 涉及访问内部 std::list,那么您就有麻烦了。如果这些槽仅通过排队或自动连接(例如 Obj 3 中的某些信号)调用,那么就可以了。如果这些槽是线程安全的(例如,它们只将“ping”消息放入某种内部同步消息队列中),那么也没关系。不过,后一种方式看起来像是排队连接机制的自定义重新实现。

总的来说,这整件事对我来说看起来太危险了,因为可以从任何地方错误地调用插槽。我会尝试通过在那里进行一些安全检查来避免这种事情,如下所示:

void Obj2::ping() {
    if (QThread::currentThread() != this->thread()) {
        // not sure how efficient it is
        QMetaObject::invoke(this, "ping", Qt::QueuedConnection);
        return;
    }
    // thread unsafe code goes here
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这种线程间通信的方法安全吗? 的相关文章

  • boost::interprocess 准备好迎接黄金时间了吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发一个由内存映射文件支持的线
  • 在两个 .cpp 文件之间定义全局变量 [重复]

    这个问题在这里已经有答案了 如何在 A cpp 和 B cpp 之间共享 全球化 bool 变量 其中它们都不包含其他 h 文件 他们有其他联合头文件 但彼此没有 我可以在这些共享标头中定义全局变量吗 Thanks 我可以在这些共享标头中定
  • 实体框架中的重复键异常?

    我试图捕获当我将具有给定用户名的现有用户插入数据库时 引发的异常 正如标题所说 我正在使用 EF 当我尝试将用户插入数据库时 引发的唯一异常是 UpdateException 如何提取此异常以识别其是否是重复异常或其他异常 catch Up
  • .NET Windows 服务中调用 C# 的 wait 的 I/O 回调是否可以不阻塞?

    我知道在 ASP NET 中 当使用 wait 时工作线程会返回到池中 而 I O 发生在后台 这对于可扩展性非常有用 我的 Windows 服务是一个套接字服务器 它使用 Begin End 样式的异步套接字 I O 混合我的魔法 我知道
  • 从 .Net 将简单数据插入 Excel 文件的最简单方法

    我有一个 Excel 文件 大约有 10 列和 1 20 行 我需要插入 1 20 行包含各种数据元素 我想知道是否有一种方法可以将一些标签放入 Excel 文件中 以便可以找到并替换它们 将列标记为 名称 的东西 这样我就可以在代码中说
  • Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的? [复制]

    这个问题在这里已经有答案了 从设置线程状态的角度来看 我不清楚这两种方法 Java 文档说 Thread interrupt 设置线程中断状态标志 调用 Thread interrupted 方法给出线程的状态并清除该标志 当这在实际场景中
  • C# ConfigurationManager 从 app.config 检索错误的连接字符串

    我有一个简单的 WinForms 应用程序 它最终将成为一个游戏 现在 我正在研究它的数据访问层 但遇到了障碍 我创建了一个单独的项目 名为DataAccess在其中 我创建了一个本地 mdfSQL Server 数据库文件 我还创建了一个
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • 实体框架7审计日志

    我正在将一个旧项目移植到 ASP NET 5 和 Entity Framework 7 我使用数据库优先方法 DNX 脚手架 来创建模型 旧项目基于Entity Framework 4 审计跟踪是通过重写实现的SaveChanges的方法D
  • 未定义异常变量时通过引用捕获

    捕获异常时 标准指导是按值抛出 按引用捕获 据我了解 这有两个原因 如果由于内存不足异常而引发异常 我们将不会调用可能终止程序的复制构造函数 如果异常是继承层次结构的一部分 我们可能会对异常进行对象切片 如果我们有一个场景 我们没有在 ca
  • initializer_list 和默认构造函数重载决策

    include
  • 使用 Microsoft Graph 创建用户

    如何使用 Microsoft graph 创建用户 因为我在保存过程中遇到了权限失败的问题 我确实有几个问题 在图中调用创建用户 API 将在哪里创建用户 是在 Azure AD 还是其他地方 我尝试通过传递 json 和必需的标头来调用创
  • 为什么我的 ITexthandler 不工作?我正在尝试将 XML 解析为 ITextSharp 文档

    我正在使用 Visual Developer 2010 MVC 3 c 我正在尝试将 XML 解析为 iTextSharp 文档 如下所示 ITextHandler textHandler new ITextHandler doc text
  • 语义问题 Qt Creator:命名空间“std”中没有名为“cout”的成员

    我开始使用 Qt Creator 编写代码 对于 C 文件 我遇到很多语义问题 99 是 命名空间 yyy 中没有名为 xxx 的成员cpp文件构建 编译和输出没有问题 如果我点击例如cout 我已链接到 iostream 我是否需要在 Q
  • fscanf 和 EOF 中的否定扫描集

    我的文件中有一个以逗号分隔的字符串列表 姓名 1 姓名 2 姓名 3 我想跳过所有逗号来阅读这些名字 我写了以下循环 while true if fscanf file my string 1 break 然而 它总是比预期多执行一次 给定
  • C# - 命名空间内的类型声明

    在命名空间内而不是在类中声明类型的可能用途是什么 For ex namespace Test public delegate void Ispossible 这是有效的并且不会产生任何编译错误 但我无法想象为什么我们会以这种方式声明它而不是
  • 无效的模板相关成员函数模板推导 - 认为我正在尝试使用 std::set

    我有一个继承自基类模板的类模板 基类模板有一个数据成员和一个成员函数模板 我想从我的超类中调用它 我知道为了消除对成员函数模板的调用的歧义 我必须使用template关键字 我必须明确引用this在超级班里 this gt base mem
  • Crypto++ 和压缩 EC 密钥

    如何在 Crypto 中生成压缩的 ECDSA 密钥 AutoSeededRandomPool prng ECDSA
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函
  • 计算两个日期之间的工作日数?

    在C 中 如何计算business 或工作日 两个日期之间的天数 我以前曾经遇到过这样的任务 并且我已经找到了解决方案 当可以避免的时候 我会避免列举其间的所有日子 这里就是这种情况 正如我在上面的一个答案中看到的那样 我什至没有提到创建一

随机推荐

  • 如果 std::vector::resize 的大小参数等于当前大小怎么办?

    阅读有关 vector resize 的手册http www cplusplus com reference vector vector resize http www cplusplus com reference vector vect
  • Fogbugz 定价方案的算法

    我正在寻找一种算法来计算基于 FogBugz for your server 定价方案购买的许可证的总成本 http www fogcreek com FogBugz PriceList html http www fogcreek com
  • tidyverse 中的重复变异

    考虑以下 tibble 和以下向量 library tidyverse a lt tibble val1 10 15 val2 20 25 params lt 1 3 我还有一个功能myfun它将任意长度的向量和整数作为输入并返回相同长度的
  • 将数据帧导出到arff文件python

    我正在尝试将 pandas 数据帧导出到 arff 文件以在 Weka 中使用它 我已经看到该模块利亚克 阿尔夫 https pypi python org pypi liac arff 1 1可以用于该目的 继续查看文档here http
  • 无限调用的自定义身份验证提供程序:Spring Security

    我正在开发 Spring Boot 应用程序并有以下要求 我有两个实体 管理员 和 公司 它们有单独的表 我想要使 用 Spring Security 的两个实体的登录端点 我做了什么 我创建了两个身份验证提供程序 AdminAuthent
  • 我正在尝试使用动态排序,但检索到的列表未排序

    public List
  • 如何使 Visual Studio 2010 在 Windows Phone 项目上使用 .NET 4.0 而不是 .NET 2.0?

    这是一个 Windows Phone 7 项目 由于某些奇怪的原因 Visual Studio 2010 不允许我在项目设置的 应用程序 选项卡中将目标 NET 版本设置为 NET 4 0 它变灰了 当我编译该项目时 XNA 程序集是 NE
  • Gunicorn默认使用多少个worker?

    我似乎无法在gunicorn 文档中找到答案 当您使用gunicorn运行flask应用程序而不指定工作线程和线程的数量时 它们的默认值是多少 Command gunicorn b PORT main app 根据Gunicorn http
  • C++ 中的时间计数器 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想用 C 编写一段代码 在等待用户输入例如我们想要看到的整数结果时同时进行时间计数 例如 我们希望用户输入两个整数并选择其中一个四次
  • 如何在 Prolog 中从另一个谓词调用一个谓词?

    所以我刚开始 Prolog 我想知道两件事 1 是否有内置函数 或者它们都称为谓词 用于简单的事情 例如最多2个数字 或数字的正弦等 如果有 我如何访问它们 2 如何从另一个谓词调用谓词 我写了两个谓词 称为 car 和 cdr car 返
  • JavaFX ComboBox CSS 样式

    我正在使用 JavaFX FXML 构建一个小型应用程序 并尝试实现一些简单的 CSS 以获得特定的样式 我对组合框元素有疑问 事实上 默认情况下它的颜色是灰色的 我想将其设置为白色 或透明 并保留边框 以匹配与文本字段相同的样式 所以我尝
  • iPhone 在 UITextField touch 上显示日期选择器

    我关注了这个线程 通过单击文本字段来选择日期 https stackoverflow com questions 7308754 datepicker by clicking on textfield 我导入了以下两个协议 interfac
  • Visual Studio 2022 TypeScript IntelliSense 在 17.2 中损坏

    我有几个 TypeScript 项目 其中 IntelliSense 不再正常工作 我怀疑它可能在 17 2 中被破坏 因为我昨天更新了版本 F12 去定义 大部分已经不再起作用了 如果我搜索所有引用 它会找到一堆引用 但实际的类定义被分类
  • 强制更新 Accurev 中的工作区

    Accurev中有没有命令可以强制更新我的工作区 直接用备份文件替换本地文件 并且不关心冲突文件 修改文件等 我真的很怀念 cvs 命令 cvs update C d 根据提问 我也有类似的问题 通常我只使用以下命令 accurev upd
  • Kafka 对同一主题和分区的多个生产者进行排序

    假设我有两个生产者 ProducerA 和 ProducerB 使用单个分区写入同一主题 每个制作人都在连续编写自己独特的事件 因此 如果 ProducerA 触发了 3 个事件 然后 ProducerB 触发了 3 个事件 我的理解是 K
  • 在 angularjs 中使用 json 漂亮的打印

    我怎样才能使用这个 json 漂亮的打印 http jsfiddle net KJQ9K http jsfiddle net KJQ9K 与 AngularJS 假设我的 JsonValue 是 a 1 b foo c false fals
  • PredicateBuilder 如何工作

    C in a Nutshell 有一个名为 PredicateBuilder 的免费类 它可以逐个构建可用的 LINQ 谓词here http www albahari com nutshell predicatebuilder aspx
  • 如何从命令行从闪存驱动器运行包中包含类的java程序?

    我有一项任务 必须在闪存驱动器中提交我的代码 我在 eclipse 中完成了所有编码并获取了所有输出 我尝试通过命令行运行它并且它有效 我将所有 java 文件和类文件复制到闪存驱动器 并通过命令行再次尝试 它在我的笔记本电脑上运行 但是当
  • 如何将 arrayformula 与似乎不支持 arrayformula 的公式一起使用?

    如果提供数组作为某些函数的正常标量参数的输入 例如 INDEX GCD GOOGLETRANSLATE OFFSET QUERY IMPORTRANGE AND 它不返回数组 即使由 ARRAYFORMULA 包装 它只获取数组中第一项的值
  • 这种线程间通信的方法安全吗?

    我有3个对象 继承自QObject 每个都包含一个单独的std list 每个对象都是在主 gui 线程 没有父线程 中创建的 然后被推送到它自己的线程 使用 Qt 的QObject moveToThread 每个线程都连接到一个 GUI