关于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.mzph.cn/bicheng/65523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全专有名词详解_2

57.Webshell 就是以ASP、php、jsp、cgi等网页文件形式存在的一种命令执行环境,也叫做网页的后门,可以上传下载文件,查看数据库和执行任意的程序命令等。 58.跨站攻击 XSS,是指攻击者利用网站程序对用户输入过滤不足,输…

Dify服务器部署教程

Dify的github地址: https://github.com/langgenius/dify 服务器要求:2c4g 1、克隆仓库 可以通过命令或者下载zip解压后上传服务器都行 git clone https://github.com/langgenius/dify.git 2、docker启动 cd dify/dockercp .env.example .envdocker compose up -d…

Mac 12.1安装tiger-vnc问题-routines:CRYPTO_internal:bad key length

背景:因为某些原因需要从本地mac连接远程linxu桌面查看一些内容,必须使用桌面查看,所以ssh无法满足,所以决定安装vnc客户端。 问题: 在mac上通过 brew install tiger-vnc命令安装, 但是报错如下: > D…

大模型WebUI:Gradio全解系列9——Additional Features:附加功能(上)

大模型WebUI:Gradio全解系列9——Additional Features:附加功能(上) 前言本篇摘要9. Additional Features:附加功能9.1 队列9.1.1 使用方法9.1.2 配置队列演示 9.2 输入输出流9.2.1 输出流1. 生成器yield2. 流媒体 9.2…

Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析

文章目录 PreApache CommonsApache Commons ProperLogging (Apache Commons Logging ) JCL 集成logbackPOM依赖配置文件 logback.xml使用 源码分析jcl-over-slf4j 的工作原理1. LogFactory 的实现2. SLF4JLogFactory 和 Log 的实例化过程3. SLF4JLog 和 …

文档大师:打造一站式 Word 报告解决方案1

前言 在政府、医院、银行、财务以及销售等领域,常常需要创建各种报告文件来展开工作汇报,譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工具支持之前,这类报告主要通过 Word 制作,费时费力且难以维护&#…

中介者模式(Mediator Pattern)、桥接模式(Bridge Pattern) 和 策略模式(Strategy Pattern)

中介者模式(Mediator Pattern)、桥接模式(Bridge Pattern) 和 策略模式(Strategy Pattern) 都是常见的设计模式,它们解决不同类型的问题。我们将通过 Swift 示例来说明它们的使用场景&#xff0…

阿尔萨斯(JVisualVM)JVM监控工具

文章目录 前言阿尔萨斯(JVisualVM)JVM监控工具1. 阿尔萨斯的功能2. JVisualVM启动3. 使用 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff…

<数据集>芝麻作物和杂草识别数据集<目标检测>

数据集下载链接 <数据集>芝麻作物和杂草识别数据集<目标检测>https://download.csdn.net/download/qq_53332949/90181548数据集格式:VOCYOLO格式 图片数量:1300张 标注数量(xml文件个数):130…

STM32-笔记18-呼吸灯

1、实验目的 使用定时器 4 通道 3 生成 PWM 波控制 LED1 ,实现呼吸灯效果。 频率:2kHz,PSC71,ARR499 利用定时器溢出公式 周期等于频率的倒数。故Tout 1/2KHZ;Ft 72MHZ PSC71(喜欢设置成Ft的倍数&…

【Java】接口多态练习题

设计一个USB接口,USB接口拥有启动和停止方法,网卡类实现USB接口,重写实现网卡启动停止方法 声卡类实现USB接口,重写实现声卡启动和停止方法, 主板类拥有使用USB接口的方法。方法接收USB接口类型或子类型,方…

JVM实战—4.JVM垃圾回收器的原理和调优

大纲 1.JVM的新生代垃圾回收器ParNew如何工作 2.JVM老年代垃圾回收器CMS是如何工作的 3.线上部署系统时如何设置垃圾回收相关参数 4.新生代垃圾回收参数如何优化 5.老年代的垃圾回收参数如何优化 6.问题汇总 1.JVM的新生代垃圾回收器ParNew如何工作 (1)JVM的核心运行原理…

E-commerce .net+React(一)——项目初始化

文章目录 项目地址一、创建.Net环境1.1环境配置1.1.1 使用vscode创建webapi1.1.2 Clean architecture结构创建1.1.3 将创建好结构的项目添加到git里1.1.4 EF Core配置1. 在infrastructure里安装EF所需环境2. 创建Product数据模型3. 创建EF Core的DbContext 数据库上下文4. 创建…

lua和C API库一些记录

相关头文件解释 lua.h:声明lua提供的基础函数,所有内容都有个前缀lua_; luaxlib.h:声明辅助库提供的函数,所有内容都有个前缀luaL_; lualib.h:声明了打开标准库的函数; 辅助库对…

elasticsearch-java客户端jar包中各模块的应用梳理

最近使用elasticsearch-java客户端实现对elasticsearch服务的Api请求,现对elasticsearch-java客户端jar包中各模块的应用做个梳理。主要是对co.elastic.clients.elasticsearch路径下的各子包的简单说明。使用的版本为:co.elastic.clients:elasticsearch-…

机器学习 LightGBM 算法原理解析

摘要: 本文深入探讨机器学习中的 LightGBM 算法,从其基本概念出发,详细阐述了核心原理,包括直方图算法、单边梯度采样、互斥特征捆绑等关键技术,对比分析了与传统 GBDT 算法的差异,还介绍了参数调优策略及在…

vscode实用插件(持续更新)

目录 Git History Diff Git Graph Error Lens Git History Diff 用于将当前分支的某个文件夹与远程分支的相同文件夹做对比,方便代码评审!解决了为了一个问题而多次commit,导致代码不好评审,即不晓得和远程分支相比&#xff0…

full-stack-fastapi-template postgres 管理系统安装指南

full-stack-fastapi-template postgres 管理系统安装指南 本项目基于 full-stack-fastapi-template 模板开发 1. 环境准备 请确保您的系统已安装以下软件: Python 3.9 Node.js 16 PostgreSQL 13 Git Docker (可选,用于容器化部署) 2. 获取代码 # 2.…

关于window.open 被浏览器拦截解决方案

分析原因 当浏览器检测到非用户操作产生的新弹出窗口时,会对其进行阻止,因为浏览器认为这可能是广告,不是用户期望的页面。 注意: 如果 window.open 是在用户触发事件(如点击事件)或页面加载时调用&#…

并发编程-AQS

AQS 什么是AQS java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个同步框架,可以用来实现…