当前位置: 首页 > news >正文

关于Qt::BlockingQueuedConnection的死锁问题

绑定信号槽时,如果信号对象和槽对象属于不同的线程,通过Qt::BlockingQueuedConnection可以实现同步调用,即发送信号的代码等待槽函数返回才继续运行

文档的说明:

Qt::QueuedConnection
The slot is invoked when control returns to the event loop of the receiver’s thread. The slot is executed in the receiver’s thread.
Qt::BlockingQueuedConnection
Same as Qt::QueuedConnection, except that the signalling thread blocks until the slot returns. This connection must not be used if the receiver lives in the signalling thread, or else the application will deadlock.

这里有一种情况需要特别注意,假设UI线程为A,工作线程为B,发送信号的代码运行于线程B,但声明信号的对象属于线程A,此时会造成死锁,什么场景会产生?
例如UI线程创建了信号对象S,该对象有一个函数S::Process,内部会发送信号sigDone,绑定了sigDone和UI线程的槽函数。然后通过QtConcurrent调用了S::Process,虽然S::Process实际运行于QtConcurrent的线程,但对象S属于UI线程,调用sigDone时就会死锁。
所以,识别Qt::BlockingQueuedConnection是否会死锁,根本在于判断connect时发送对象所属的线程是否不同于接收对象线程,而不是发送信号(emit XXX这一句代码)时所在的线程!
解决办法是通过QObject::moveToThread改变信号对象所属线程,你可以通过QObject::thread查看当前对象所属的线程

http://www.lryc.cn/news/511877.html

相关文章:

  • Excel for Finance 07 `FV PV` 函数
  • 驱动开发系列31 - Linux Graphics 调试 mesa 的 glDrawArrays (三)
  • 【探花交友】day03—MongoDB基础
  • 【Vue教程】使用Vite快速搭建前端工程化项目 | Vue3 | Vite | Node.js
  • 手机租赁平台开发全攻略打造高效便捷的租赁服务系统
  • 自由学习记录(31)
  • 【探花交友】用户登录总结
  • LabVIEW声波谐振管自动化测量系统
  • elasticsearch中的倒排索引
  • 【Elasticsearch】DSL查询文档
  • 接口测试Day04-postman生成测试报告ihrm项目
  • 常见的排序算法过程和比较分析
  • 基于Vue+SSM+SpringCloudAlibaba书籍管理系统
  • 生成式 AI 增强了个人创造力,但减少了新内容的集体多样性
  • 【DC简介--Part1】
  • Spark写入HDFS数据SUCCESS文件生成控制
  • MySQL 服务器简介
  • 如何使用Python从SACS结构数据文件中提取节点数据信息并导出到EXCEL
  • Java网约车项目实战:实现抢单功能详解
  • SSRF服务端请求Gopher伪协议白盒测试
  • html+css+js网页设计 美食 家美食1个页面
  • 初学stm32---高级定时器输出n个pwm波
  • 旅游管理系统|Java|SSM|VUE| 前后端分离
  • imgproxy图像处理的高效与安全
  • LLM并行计算的论文
  • Linux 搭建 nginx+keepalived 高可用 | Nginx反向代理
  • Spring Boot 项目中 Maven 剔除无用 Jar 引用的最佳实践
  • useWhyDidYouUpdate详解
  • c++入门——c++输入cin和输出cout的简单使用
  • Spring Cloud LoadBalancer (负载均衡)