Qt QMutexLocker类详解--自动锁定/解锁,告别死锁烦恼 📅 发布时间:2026/7/11 5:17:35 👁️ 浏览次数: Qt QMutexLocker类详解--自动锁定/解锁告别死锁烦恼一、Qt QMutexLocker类详解1、核心作用2、典型用法3、 关键特性4、重要注意事项5、 总结二、代码示例一、Qt QMutexLocker类详解QMutexLocker是 Qt 框架中提供的一个辅助类用于简化互斥锁QMutex的使用。它遵循了资源获取即初始化Resource Acquisition Is Initialization, RAII的设计理念确保锁的获取和释放与对象的生命周期绑定从而避免忘记解锁导致的死锁问题。1、核心作用自动加锁与解锁在创建QMutexLocker对象时它会尝试获取关联的QMutex锁。当QMutexLocker对象离开其作用域例如函数结束、代码块结束被销毁时它会自动释放关联的QMutex锁。简化代码 消除了手动调用lock()和unlock()的需要使代码更简洁、更不易出错。异常安全 即使在加锁后的代码中发生了异常QMutexLocker的析构函数也能保证锁被正确释放。2、典型用法voidsomeFunction(){QMutex mutex;// 假设有一个共享的互斥锁// ... 一些不需要锁的操作 ...{QMutexLockerlocker(mutex);// 创建锁管理器对象立即锁定mutex// 临界区 (Critical Section)// 在这里安全地访问和修改受 mutex 保护的共享资源// ...}// locker 对象在此处离开作用域自动解锁 mutex// ... 一些不需要锁的操作 ...}3、 关键特性构造函数QMutexLocker locker(QMutex *mutex);参数指向一个QMutex对象的指针。行为构造时立即尝试锁定mutex。如果mutex是递归锁且当前线程已持有它则增加锁计数如果是非递归锁且线程已持有会导致死锁取决于QMutex的构造方式。析构函数~QMutexLocker();行为销毁对象时自动解锁关联的mutex。手动解锁void unlock();行为在锁管理器对象销毁前可以手动提前释放锁。调用此方法后QMutexLocker对象进入解锁状态析构时不会再尝试解锁。手动重新加锁void relock();行为如果之前调用过unlock()提前解锁了可以使用relock()再次获取锁。在未解锁状态下调用relock()没有效果。获取互斥锁指针QMutex *mutex() const;行为返回关联的QMutex对象的指针。4、重要注意事项作用域限制QMutexLocker对象应该在尽可能小的作用域内创建。通常在一个代码块{ ... }内创建这样可以精确控制锁的持有时间减少锁竞争提高性能。递归锁QMutexLocker本身不改变QMutex的行为。如果关联的QMutex是以QMutex::Recursive模式创建的递归锁那么同一个线程可以多次加锁QMutexLocker的构造会增加计数并且需要相同次数的解锁QMutexLocker的析构或unlock()会减少计数。如果QMutex是非递归锁同一个线程再次尝试加锁会导致死锁。不可复制/移动QMutexLocker对象不能被复制或移动。它绑定在其创建的作用域内。关联互斥锁的生命周期 必须确保在QMutexLocker对象的生命周期内其关联的QMutex对象始终存在且有效。通常QMutex的生命周期应长于可能使用它的QMutexLocker对象。5、 总结QMutexLocker是一个简单而强大的工具用于管理QMutex的锁定状态。它通过自动化锁的获取和释放极大地提高了多线程代码的健壮性和可读性是编写线程安全 Qt 代码时的首选方式。二、代码示例#includemainwindow.h#includeui_mainwindow.hMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui-setupUi(this);}MainWindow::~MainWindow(){deleteui;}#includeQCoreApplication#includeQThread#includeQMutex#includeQMutexLocker#includeQDebug// 定义一个共享资源类classSharedResource{public:voidincrement(){// 使用 QMutexLocker 自动加锁和解锁QMutexLockerlocker(m_mutex);// 进入作用域时加锁m_counter;// 安全地修改共享资源qDebug()Counter incremented to:m_counterbyQThread::currentThread();// locker 在离开作用域时自动解锁}intgetCounter()const{QMutexLockerlocker(m_mutex);returnm_counter;}private:mutableQMutex m_mutex;// 可变的互斥锁intm_counter0;};// 定义一个工作线程类classWorkerThread:publicQThread{public:WorkerThread(SharedResource*resource):m_resource(resource){}voidrun()override{for(inti0;i5;i){m_resource-increment();QThread::msleep(100);// 模拟工作}}private:SharedResource*m_resource;};voidMainWindow::on_pushButton_clicked(){SharedResource*sharedResourcenewSharedResource;// 创建并启动两个工作线程WorkerThread*thread1newWorkerThread(sharedResource);WorkerThread*thread2newWorkerThread(sharedResource);thread1-start();thread2-start();}运行结果10:39:16:Starting G:\Learning\Qt\untitled6\build\Desktop_Qt_6_9_0_MinGW_64_bit-Debug\debug\untitled6.exe...Counter incremented to:1byQThread(0x1e5a0501930)Counter incremented to:2byQThread(0x1e5a0501830)Counter incremented to:3byQThread(0x1e5a0501930)Counter incremented to:4byQThread(0x1e5a0501830)Counter incremented to:5byQThread(0x1e5a0501930)Counter incremented to:6byQThread(0x1e5a0501830)Counter incremented to:7byQThread(0x1e5a0501930)Counter incremented to:8byQThread(0x1e5a0501830)Counter incremented to:9byQThread(0x1e5a0501830)Counter incremented to:10byQThread(0x1e5a0501930)代码说明SharedResource类包含一个共享整数m_counter。使用QMutex m_mutex来保护对该共享资源的并发访问。increment()方法创建QMutexLocker locker(m_mutex)。关键点在这里QMutexLocker的构造函数会自动锁定m_mutex。在locker对象的作用域内即整个函数体m_counter可以被安全地访问和修改因为m_mutex已被锁定。当函数执行完毕locker对象被销毁时它的析构函数会自动解锁m_mutex。这确保了即使函数中途抛出异常锁也会被正确释放避免了死锁。getCounter()方法同样使用QMutexLocker来安全地读取m_counter的值。m_mutex被声明为mutable以便在const成员函数中也能锁定它。WorkerThread类继承自QThread。在run()方法中循环多次调用SharedResource::increment()来增加计数器。QThread::msleep(100)模拟一些工作增加线程交错执行的可能性。main函数创建SharedResource对象。创建两个WorkerThread对象都操作同一个SharedResource。启动两个线程。使用wait()等待两个线程完成工作。最后打印最终的计数器值。
书生浦语实战训练营——L2G3000-LMDeploy 量化部署书生大模型实践 最近在学习书生第六期实战训练营,提供免费的算力和教程,如果感兴趣就一起来学习吧! 文章目录一、开发机选择和环境配置二、快速部署三、高并发请求四、Openai格式起Server五、量化部署5.1 INT4 模型量化和部署5.2 KVCache 量化和部署一、开发… 2026/7/10 15:12:40
不止PPT:9款“小学语文课件PPT制作”工具,全方位赋能教学 我发现很多老师虽然在教学方面经验丰富,但在PPT制作方面可能没有太多时间投入。这时,一款得心应手的“小学语文课件ppt制作”软件,就显得尤为重要。 下面,我将为大家介绍9款在我看来,在“小学语文课件ppt制作”领域表现… 2026/7/4 20:15:25
软件信创测试计划制定指南:规范信创测试全流程 软件信创测试计划是信创测试工作的总纲领,明确了测试的目标、范围、标准、资源、进度等核心内容,是确保软件信创测试工作有序、高效开展的关键,也是保障信创软件验收顺利通过的基础。很多信创项目在测试过程中出现范围失控、进度滞后、标准模… 2026/7/9 14:22:04
ECS架构动画状态机:性能提升300%的Unity游戏动画优化方案 1. 项目概述:为什么ECS动画状态机是性能优化的“核武器”? 如果你是一名游戏开发者,尤其是负责过中大型项目角色动画模块的,那么“卡顿”这个词绝对是你职业生涯中的噩梦。当屏幕上角色数量从几十个增加到几百上千个时,… 2026/7/11 19:56:13
DC 与 DCT 综合模式对比:2种启动命令对时序收敛的影响分析 DC与DCT综合模式深度解析:从原理到时序收敛实战在数字集成电路设计流程中,逻辑综合是将RTL级设计转换为门级网表的关键步骤。Synopsys Design Compiler(DC)作为行业标准工具,提供了两种核心工作模式:传统Wi… 2026/7/11 19:56:13
STM32L162ZE上拉下拉电阻配置与DTH-08接口设计 1. 信号上拉与下拉的基础原理在嵌入式系统设计中,信号的上拉和下拉是确保数字电路可靠工作的基础技术。当信号线处于"悬空"状态时,其电平可能处于不确定的中间值,这会导致逻辑错误甚至器件损坏。上拉和下拉电阻通过将信号线连接到电… 2026/7/11 19:56:13
华为交换机 BPDU 保护配置:边缘端口 error-down 自动恢复 30 秒生效 华为交换机BPDU保护与自动恢复机制深度解析在当今企业网络架构中,生成树协议(STP)及其衍生协议(如RSTP、MSTP)是防止二层环路的基石技术。然而,当非授权设备(如私自接入的交换机)连接… 2026/7/11 19:52:13
MATLAB 2019b 数据导入实战:5种文件格式读取函数对比与性能实测 MATLAB 2019b 数据导入实战:5种文件格式读取函数深度评测与优化指南在工程计算和科研分析中,数据导入往往是整个工作流程的第一步,也是最容易遭遇性能瓶颈的环节。MATLAB 2019b提供了多种数据导入函数,但不同函数在速度、内存占用… 2026/7/11 19:48:12
突破iOS激活锁壁垒:applera1n技术深度解析与实战应用 突破iOS激活锁壁垒:applera1n技术深度解析与实战应用 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 当二手iPhone屏幕上出现"此iPhone已关联到所有者"的提示,或是忘… 2026/7/11 19:48:12
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/11 14:53:30
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/11 12:30:52
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/11 15:29:59