【QT】系统相关:QT中的锁

发布时间:2026/10/3 11:45:28

【QT】系统相关:QT中的锁 个人主页艾莉丝努力练剑❄专栏传送门《C语言》《数据结构与算法》《C/C干货分享学习过程记录》《Linux操作系统编程详解》《笔试/面试常见算法从基础到进阶》《Python干货分享》⭐️为天地立心为生民立命为往圣继绝学为万世开太平 艾莉丝的简介文章目录1 ~ Qt 锁机制与线程安全1.1 线程安全基础1.1.1 线程安全问题产生根源1.2 QMutex 互斥锁基础使用1.2.2 核心接口1.2.3 复现线程不安全 Demo1.2.4 使用 QMutex 解决线程安全1.3 锁的异常风险与 RAII 守卫锁 QMutexLocker1.3.1 手动 lock/unlock 存在的缺陷1.3.2 RAII 思想1.3.3 QMutexLocker 代码示例1.3.4 Qt 锁与 C 标准锁混用说明1.4 Qt 读写锁 QReadWriteLock1.4.1 适用场景1.4.2 配套守卫类1.4.3 读写锁代码示例1.5 核心面试考点总结结尾1 ~ Qt 锁机制与线程安全1.1 线程安全基础1.1.1 线程安全问题产生根源多线程并发访问共享公共资源线程调度顺序不可预测。简单自增num不是原子操作底层对应多条 CPU 指令线程可以在指令中间被调度切换造成数据竞争最终计算结果错误。解决方案核心思想加锁将并发访问转变为串行访问。底层来源Linux 原生mutex互斥量C11 标准库std::mutex对操作系统互斥量封装QtQMutex同样封装操作系统互斥量类命名遵循 Q 前缀规则。1.2 QMutex 互斥锁基础使用1.2.2 核心接口void lock()加锁。若锁已经被其他线程持有调用线程阻塞等待直到获取锁。void unlock()释放锁。必须由持有锁的线程调用。1.2.3 复现线程不安全 Demo业务场景两个 QThread 子线程同时对同一个静态共享变量循环累加。 预期结果每个线程循环 50000 次最终结果 100000不加锁会出现小于 100000 的错误结果。thread.h#ifndefTHREAD_H#defineTHREAD_H#includeQThreadclassThread:publicQThread{Q_OBJECTpublic:Thread();// 共享静态变量多线程访问staticintnum;protected:// 线程入口函数重写runvoidrun()override;};#endif// THREAD_Hthread.cpp#includethread.h// 静态成员必须在类外初始化intThread::num0;Thread::Thread(){}voidThread::run(){// 不加锁并发修改共享变量线程不安全for(inti0;i50000;i){num;}}widget.cpp#includewidget.h#includeui_widget.h#includethread.h#includeQDebugWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);Thread t1;Thread t2;t1.start();t2.start();// 主线程等待两个子线程执行完毕再打印结果不调用wait会直接打印未完成值t1.wait();t2.wait();qDebug()Thread::num;}Widget::~Widget(){deleteui;}现象输出结果小于 100000复现数据竞争线程安全 bug。1.2.4 使用 QMutex 解决线程安全注意多线程互斥所有线程必须操作同一个锁对象若每个线程持有独立锁对象无法实现互斥保护。锁对象定义为static保证全局唯一。thread.h 修改后#ifndefTHREAD_H#defineTHREAD_H#includeQThread#includeQMutexclassThread:publicQThread{Q_OBJECTpublic:Thread();staticintnum;// 静态互斥锁对象所有线程共用同一把锁staticQMutex mutex;protected:voidrun()override;};#endif// THREAD_Hthread.cpp 修改后#includethread.hintThread::num0;// 静态锁对象类外定义初始化QMutex Thread::mutex;Thread::Thread(){}voidThread::run(){for(inti0;i50000;i){mutex.lock();// 加锁num;// 临界区访问共享资源mutex.unlock();// 解锁}}运行结果输出固定100000线程安全问题消除。1.3 锁的异常风险与 RAII 守卫锁 QMutexLocker1.3.1 手动 lock/unlock 存在的缺陷手动配对lock()/unlock()极易出现锁泄漏锁没有释放场景临界区内部存在if分支return提前退出函数unlock()不会执行。临界区代码抛出异常程序流程跳转unlock()无法执行。锁泄漏后果其他线程永久阻塞等待锁发生程序卡死。1.3.2 RAII 思想C RAII资源获取即初始化利用局部对象的生命周期自动管理资源。C11 标准库std::lock_guardstd::mutex栈对象构造时加锁析构时解锁。Qt 对应封装类QMutexLocker功能等价接收锁指针作为构造参数栈局部对象出作用域自动析构自动执行 unlock。1.3.3 QMutexLocker 代码示例#includethread.h#includeQMutexLockerintThread::num0;QMutex Thread::mutex;Thread::Thread(){}voidThread::run(){for(inti0;i50000;i){// 局部栈对象构造时lock(mutex)QMutexLockerlocker(mutex);num;// 无需手动unlock出循环迭代的大括号locker局部对象析构自动调用unlock}}无论内部 return、异常抛出只要离开当前作用域局部 locker 对象析构锁一定会释放。1.3.4 Qt 锁与 C 标准锁混用说明Qt 锁QMutex与 C 标准锁std::mutex底层都封装操作系统原生互斥 API技术上可以混用。工程实践不推荐混用接口、守卫类不统一QMutexLockervsstd::lock_guard提高维护成本容易写出错误代码。1.4 Qt 读写锁 QReadWriteLock1.4.1 适用场景少写多读业务场景大量线程并发读取共享数据极少线程修改数据。普通互斥锁 QMutex读写全部串行读操作之间也会互相阻塞并发性能差。读写锁特性读锁与读锁不互斥多个线程可以同时获取读锁并发读取读锁与写锁互斥写锁与写锁互斥写操作独占资源同一时刻只允许一个线程执行写。1.4.2 配套守卫类QReadLocker读锁 RAII 守卫构造上读锁析构释放读锁QWriteLocker写锁 RAII 守卫构造上写锁析构释放写锁1.4.3 读写锁代码示例#includeQReadWriteLockQReadWriteLock rwLock;// 读操作多线程可并发执行{QReadLockerlocker(rwLock);// 执行只读访问共享资源}// 作用域结束自动释放读锁// 写操作独占访问{QWriteLockerlocker(rwLock);// 修改共享资源}// 作用域结束自动释放写锁1.5 核心面试考点总结使用 QMutex 必须保证多线程操作同一个锁实例static 成员是常用实现方式。wait()作用主线程阻塞等待子线程执行完毕不 wait 直接读取共享变量会读到未计算完成的中间值。num不是原子操作是线程不安全典型案例。优先使用 RAII 守卫类QMutexLocker不要裸写 lock/unlock规避锁泄漏。QReadWriteLock 优势少读多写场景提升并发吞吐量写的时候所有读全部阻塞。锁泄漏锁加完之后没有释放会造成其他线程永久阻塞。Qt 锁与 C 标准锁底层都是操作系统 mutex 封装但工程禁止随意混用。结尾uu们本文的内容到这里就全部结束了艾莉丝在这里再次感谢您的阅读艾莉丝努力练剑C/C Linux 底层探索者 | 一个正在努力练剑的技术博主【关注】跟随我一起深耕技术领域见证每一次成长。❤️【点赞】让优质内容被更多人看见让知识传递更有力量。⭐【收藏】把核心知识点存好在需要时随时查、随时用。【评论】分享你的经验或疑问评论区一起交流避坑不要忘记给博主“一键四连”哦“今日练剑达成”“技术之路难免有困惑但同行的人会让前进更有方向。”结语希望对学习Linux相关内容的uu有所帮助不要忘记给博主“一键四连”哦往期回顾【QT】系统相关多线程QThread基础博主在这里放了一只小狗大家看完了摸摸小狗放松一下吧૮₍ ˶ ˊ ᴥ ˋ˶₎ა
延伸阅读

更多相关文章

2026/10/3 11:40:28

Kaggle房价预测实战:从缺失值处理到模型集成全解析

打开这个比赛的 Notebook 时,我做了三件蠢事:先去看了别人的高分代码,然后尝试原样运行,最后对着完全不同的输出一脸茫然。后来我才明白,问题根本不是模型跑不起来,而是我压根没搞懂这个数据集在表达什么。…

2026/10/3 11:40:28

ROS2 Launch实战:编排节点、传参与排障,告别多终端地狱

在ROS2里跑一个稍微完整一点的功能包,基本就是“终端地狱”:左边终端起仿真、右边终端起控制器、后面还得再来一个开Rviz,每个终端先 source ,再敲 ros2 run ,节点一多,顺序错一个就全乱套。launch就是…

2026/10/3 11:40:28

从零搭建AI工程能力:打通模型从实验到生产的完整链路

1. 从零搭建AI工程能力:这个项目到底在解决什么问题第一次看到ai-engineering-from-scratch这个标题,我脑子里蹦出来的第一个念头是:又一个“从入门到放弃”的教程合集?但翻了一圈社区讨论和实际动手跑过之后,我发现它…

2026/10/3 14:25:34

深入理解PCIe ACS:IOMMU分组与设备直通的关键机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 14:25:34

Python新能源汽车数据分析系统:从数据采集到可视化全流程实践

前阵子刚完成一个“基于Python的新能源汽车数据分析系统”,趁着还有热乎劲儿,把整个设计和实现过程做个复盘。这类系统在两三年前还多半是论文里的概念,现在已经是不少车企、出行公司和二手车平台实际在用的基础工具了。只要是涉及新能源汽车…

2026/10/3 14:25:34

PyCharm安装配置全攻略:从解释器绑定到External Tools实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 14:25:34

Flutter contacts插件鸿蒙化适配全记录:从原理到实战

上个月接了个鸿蒙化的适配需求:把项目里基于 Flutter 的通讯录功能整体迁到鸿蒙设备上。项目里的联系人模块一直用的都是 contacts 这个三方库,本身在 Android 和 iOS 上跑得挺稳,结果一到鸿蒙这边,编译期就先卡住了——pubspec 里…

2026/10/3 14:20:34

Copilot通过MCP连接MySQL:配置流程与常见排错指南

要让 Copilot 直接查数据库,听起来像是个挺魔幻的需求,但我花了大概一个晚上的时间,把 VS Code 里的 Copilot 通过 MCP 接上了本机的 MySQL,现在它真的能帮我查表结构、查数据、甚至做简单的统计分析了。整个过程没有想象中复杂&a…

2026/10/2 8:16:46

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/2 18:20:53

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 0:04:31

国内大学生必备的AI写作辅助软件是哪款?

国内高校学生在论文写作过程中,越来越依赖AI辅助工具提升效率,主流方案以本土化全流程工具为核心,结合通用大模型与专业插件,覆盖选题构思、框架搭建、初稿撰写、查重降重、格式调整等关键环节,本文将深入解析当前主流…

2026/10/3 0:04:31

Codex接入Jev模型完整指南:配置方法、本地部署与踩坑排查

最近不少人在讨论 Codex 搭配 Jev 这套玩法,我一开始没太当回事,直到自己把 Jev 接进 Codex跑了几轮编码任务之后,才明白那些说“直接起飞”的人是怎么想的。Codex 作为工具本身已经够能打了,但模型固定、上下文策略固定&#xff…

2026/10/3 0:04:31

GitHub 热门: NVIDIA/Model-Optimizer

👋 Hi,我擅长 AI 大模型应用落地、意识解码与 AI 开发工具链 。 💡 创业路上,用技术换时间,一起把 AI 变成生产力 🚀 >GitHub 热门: NVIDIA/Model-Optimizer 凌晨两点,你刚把跑通了的 Qwen3.…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑