qt 线程互斥

1.qt 线程互斥

在 Qt 中,线程互斥(Thread Mutual Exclusion)通常通过QMutex类来实现,用于保护共享资源,防止多个线程同时访问导致数据竞争(race condition)。


一、基本概念

  • 互斥锁(Mutex):一次只允许一个线程进入临界区(critical section),其他线程必须等待。
  • 临界区:访问共享资源的代码段。

二、Qt 中的互斥相关类

类名作用
QMutex基本互斥锁
QMutexLockerRAII 风格的自动加锁/解锁工具(推荐使用)
QReadWriteLock读写锁(允许多个读,但写独占)
QReadLocker/QWriteLocker对应读写锁的 RAII 封装

三、示例:使用 QMutex 和 QMutexLocker

场景:多个线程向同一个 QList 添加数据

#include <QThread> #include <QMutex> #include <QMutexLocker> #include <QList> #include <QDebug> QList<int> sharedList; QMutex mutex; class Worker : public QThread { public: void run() override { for (int i = 0; i < 100; ++i) { // 使用 QMutexLocker 自动管理锁 QMutexLocker locker(&mutex); sharedList.append(i); qDebug() << "Thread" << currentThreadId() << "added" << i; } } }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); Worker w1, w2; w1.start(); w2.start(); w1.wait(); w2.wait(); qDebug() << "Final list size:" << sharedList.size(); // 应为 200 return 0; }

✅ 使用QMutexLocker可以避免忘记调用unlock(),即使发生异常也能自动释放锁。


四、注意事项

  1. 不要在持有锁时做耗时操作(如 I/O、sleep),否则会阻塞其他线程。
  2. 避免死锁
    • 多个锁时,始终按相同顺序加锁。
    • 不要在持有锁时调用可能再次加锁的函数。
  3. QMutex 是不可重入的(默认情况下):
    • 同一线程重复 lock 会导致死锁。
    • 如需可重入,使用QRecursiveMutex(Qt 5.14+)或自己封装。

五、高级用法:条件变量配合互斥

若需线程间通信(如生产者-消费者),可结合QWaitCondition

QMutex mutex; QWaitCondition bufferNotEmpty; bool dataReady = false; // 生产者 { QMutexLocker locker(&mutex); produceData(); dataReady = true; bufferNotEmpty.wakeAll(); // 唤醒等待的消费者 } // 消费者 { QMutexLocker locker(&mutex); while (!dataReady) { bufferNotEmpty.wait(&mutex); // 自动 unlock,被唤醒后重新 lock } consumeData(); }

六、总结

  • QMutex保护共享数据。
  • 优先使用QMutexLocker实现 RAII。
  • 注意死锁和性能问题。
  • 复杂同步场景可结合QWaitCondition或使用 Qt 的信号槽机制(跨线程自动排队)。

2.qt 线程互斥的手段有多少种方法

在 Qt 中,实现**线程互斥(Thread Mutual Exclusion)**以保护共享资源、避免数据竞争的手段有多种。这些方法既包括 Qt 封装的同步原语,也兼容 C++11 标准库中的工具(因为 Qt 可与标准库共用)。以下是Qt 中常用的线程互斥手段分类和具体方法


✅ 一、Qt 原生提供的互斥机制(推荐用于 Qt 项目)

1.QMutex + QMutexLocker

  • 用途:最基本的互斥锁。
  • 特点
    • 非递归(默认),同一线程重复加锁会死锁。
    • QMutexLocker提供 RAII 自动加锁/解锁。
  • 适用场景:保护临界区,如修改共享变量、容器等。
QMutex mutex; { QMutexLocker lock(&mutex); // 临界区 }

🔸 Qt 5.14+ 引入QRecursiveMutex(可重入版本)。


2.QReadWriteLock + QReadLocker / QWriteLocker

  • 用途:读多写少场景的高性能互斥。
  • 特点
    • 多个读线程可同时访问。
    • 写操作独占(阻塞所有读和其他写)。
  • 适用场景:缓存、配置数据等频繁读、偶尔更新的结构。
QReadWriteLock rwLock; // 读 { QReadLocker locker(&rwLock); // 安全读取 } // 写 { QWriteLocker locker(&rwLock); // 安全写入 }

3.QSemaphore(信号量)

  • 用途:控制对有限数量资源的并发访问(不只是 0/1)。
  • 注意:严格来说不是“互斥锁”,但可用于实现互斥(设为 1)。
  • 适用场景:连接池、缓冲区槽位控制等。
QSemaphore sem(1); // 相当于二值信号量(互斥) sem.acquire(); // 进入临界区 // ... sem.release(); // 离开

⚠️ 不如QMutex直观,一般不用于简单互斥。


4.QWaitCondition + QMutex(条件变量)

  • 用途:线程等待某个条件成立(如队列非空)。
  • 本质:配合互斥锁使用,实现“等待-通知”机制。
  • 不是直接互斥手段,但依赖互斥锁来保护条件判断。
QMutex mutex; QWaitCondition notEmpty; // 消费者 mutex.lock(); while (queue.isEmpty()) notEmpty.wait(&mutex); // 自动 unlock,唤醒后 relock item = queue.dequeue(); mutex.unlock();

✅ 二、C++11 标准库互斥机制(Qt 项目中也可用)

Qt 支持 C++11 及以上,因此以下标准库工具同样有效:

5.std::mutex / std::recursive_mutex + std::lock_guard / std::unique_lock

  • 功能与QMutex类似。
  • 在纯 C++ 或混合项目中常用。
  • Qt 官方建议:若项目已重度使用 Qt,优先用 Qt 的类(风格统一、调试支持更好)。
#include <mutex> std::mutex mtx; { std::lock_guard<std::mutex> lock(mtx); // 临界区 }

6.std::shared_mutex(C++17) + shared_lock / unique_lock

  • 对应 Qt 的QReadWriteLock
  • 读写锁的标准库实现。

✅ 三、Qt 特色:信号与槽的线程安全机制(间接互斥)

7.跨线程信号槽(Queued Connection)

  • 虽然不是传统“互斥锁”,但通过事件队列串行化操作,天然避免并发
  • 适用场景:UI 更新、对象间通信。
// Worker 在子线程 emit signal // Main thread 的 slot 自动排队执行,无需手动加锁 connect(worker, &Worker::resultReady, this, &MainWindow::updateUI, Qt::QueuedConnection);

✅ 优势:无锁、安全、符合 Qt 设计哲学。
❌ 局限:仅适用于 QObject 之间的通信,不能保护任意共享数据。


✅ 四、原子操作(适用于简单变量)

8.QAtomicInteger / std::atomic

  • 用途:对单个整型、指针等进行无锁线程安全操作
  • 不是互斥锁,但可避免对简单变量加锁。
QAtomicInt counter; counter.fetchAndAddRelaxed(1); // 线程安全自增 // 或 C++11 std::atomic<int> count{0}; count++;

✅ 适用于计数器、标志位等。
❌ 无法保护复杂数据结构(如 QList、自定义对象)。


📊 总结:Qt 中线程互斥的主要手段(按使用频率排序)

方法是否直接互斥适用场景推荐度
QMutex + QMutexLocker✅ 是通用临界区保护⭐⭐⭐⭐⭐
QReadWriteLock✅ 是读多写少⭐⭐⭐⭐
跨线程信号槽(Queued)❌ 否(但安全)QObject 通信、UI 更新⭐⭐⭐⭐
QAtomicInteger/std::atomic❌ 否(无锁)简单变量原子操作⭐⭐⭐
std::mutex等标准库✅ 是混合 C++ 项目⭐⭐⭐
QSemaphore⚠️ 间接资源池控制⭐⭐
QWaitCondition⚠️ 配合互斥条件等待⭐⭐⭐

✅ 最佳实践建议

  1. 优先使用QMutex+QMutexLocker—— 简单、安全、Qt 风格。
  2. 读多写少?用QReadWriteLock
  3. 能用信号槽通信就别共享数据—— 避免锁。
  4. 简单计数用原子操作,避免锁开销。
  5. 避免混合使用 Qt 和 std 的同步原语,除非必要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1153736.shtml

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

相关文章

Windows Defender Control:彻底掌控系统安全防护的终极方案

Windows Defender Control&#xff1a;彻底掌控系统安全防护的终极方案 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender-control …

AI手势识别支持哪些图片格式?JPG/PNG兼容性测试

AI手势识别支持哪些图片格式&#xff1f;JPG/PNG兼容性测试 1. 引言&#xff1a;AI 手势识别与追踪的技术背景 随着人机交互技术的不断演进&#xff0c;AI手势识别正逐步从实验室走向消费级应用。无论是智能设备控制、虚拟现实交互&#xff0c;还是远程会议中的非接触操作&am…

AKTools数据接口异常排查与性能调优实战指南

AKTools数据接口异常排查与性能调优实战指南 【免费下载链接】aktools AKTools is an elegant and simple HTTP API library for AKShare, built for AKSharers! 项目地址: https://gitcode.com/gh_mirrors/ak/aktools 在金融数据获取领域&#xff0c;AKTools作为AKShar…

终极文档下载利器:kill-doc一键破解所有下载限制

终极文档下载利器&#xff1a;kill-doc一键破解所有下载限制 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档&#xff0c;但是相关网站浏览体验不好各种广告&#xff0c;各种登录验证&#xff0c;需要很多步骤才能下载文档&#xff0c;该脚本就是为了解决您…

吐血推荐9个AI论文网站,本科生轻松搞定毕业论文!

吐血推荐9个AI论文网站&#xff0c;本科生轻松搞定毕业论文&#xff01; 论文写作的“秘密武器”&#xff0c;你真的了解吗&#xff1f; 对于许多本科生来说&#xff0c;撰写毕业论文无疑是一场艰难的挑战。从选题到大纲搭建&#xff0c;再到初稿撰写和反复修改&#xff0c;每一…

内联数组 vs 动态数组:内存效率提升80%的真实案例对比分析

第一章&#xff1a;内联数组内存优化在现代高性能计算和系统级编程中&#xff0c;内存访问效率直接影响程序的整体性能。内联数组作为一种将数据直接嵌入结构体或对象中的技术&#xff0c;能够显著减少内存碎片和指针解引用开销&#xff0c;从而提升缓存命中率与运行时效率。内…

用策略模式+Lambda模拟默认参数:重构你臃肿的方法重载(性能翻倍)

第一章&#xff1a;策略模式与Lambda的默认参数重构之道在现代软件设计中&#xff0c;策略模式通过将算法的定义与使用解耦&#xff0c;提升了代码的可维护性与扩展性。传统实现通常依赖接口与多个实现类&#xff0c;但结合Lambda表达式与默认参数思想&#xff0c;可进一步简化…

Figma界面汉化终极指南:免费中文插件一键安装教程

Figma界面汉化终极指南&#xff1a;免费中文插件一键安装教程 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN Figma中文插件是一款专为中文用户设计的界面翻译工具&#xff0c;能够将Fi…

智能文档下载工具:告别繁琐流程,高效获取资料

智能文档下载工具&#xff1a;告别繁琐流程&#xff0c;高效获取资料 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档&#xff0c;但是相关网站浏览体验不好各种广告&#xff0c;各种登录验证&#xff0c;需要很多步骤才能下载文档&#xff0c;该脚本就是为…

GanttProject:开源免费的终极项目管理解决方案

GanttProject&#xff1a;开源免费的终极项目管理解决方案 【免费下载链接】ganttproject Official GanttProject repository 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject 在现代项目管理领域&#xff0c;GanttProject以其完全免费的开源特性&#xff0c…

GKD第三方订阅管理终极指南:一站式解决方案

GKD第三方订阅管理终极指南&#xff1a;一站式解决方案 【免费下载链接】GKD_THS_List GKD第三方订阅收录名单 项目地址: https://gitcode.com/gh_mirrors/gk/GKD_THS_List 你是否曾经为GKD订阅源的分散管理而烦恼&#xff1f;面对众多订阅源&#xff0c;手动维护不仅耗…

轻量级骨骼检测方案:云端T4显卡够用还省钱

轻量级骨骼检测方案&#xff1a;云端T4显卡够用还省钱 引言&#xff1a;为什么选择云端T4做骨骼检测&#xff1f; 想象一下&#xff0c;你正在开发一款健身教学小程序&#xff0c;需要实时检测用户的动作是否标准。这时候&#xff0c;骨骼关键点检测技术就能派上用场——它能…

原神抽卡数据分析完整攻略:从数据获取到深度解读

原神抽卡数据分析完整攻略&#xff1a;从数据获取到深度解读 【免费下载链接】genshin-wish-export biuuu/genshin-wish-export - 一个使用Electron制作的原神祈愿记录导出工具&#xff0c;它可以通过读取游戏日志或代理模式获取访问游戏祈愿记录API所需的authKey。 项目地址…

AI手势识别模型部署教程:彩虹骨骼可视化完整指南

AI手势识别模型部署教程&#xff1a;彩虹骨骼可视化完整指南 1. 引言 1.1 学习目标 本文将带你从零开始&#xff0c;完整部署一个基于 MediaPipe Hands 的 AI 手势识别系统&#xff0c;并实现极具视觉冲击力的 “彩虹骨骼”可视化效果。你将掌握&#xff1a; 如何在本地环境…

AR眼镜骨骼点方案:云端计算+边缘端显示最佳实践

AR眼镜骨骼点方案&#xff1a;云端计算边缘端显示最佳实践 引言&#xff1a;为什么需要云边协同的AR骨骼点方案&#xff1f; 想象一下&#xff0c;当你戴着AR眼镜玩体感游戏时&#xff0c;设备需要实时追踪你的每一个动作——从抬手到踢腿&#xff0c;从转头到弯腰。传统方案…

如何快速批量制作桌游卡牌:CardEditor完整使用指南

如何快速批量制作桌游卡牌&#xff1a;CardEditor完整使用指南 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/gh_mirrors/ca/CardEdi…

Beyond Compare 5密钥生成实用指南:3步完成永久授权配置

Beyond Compare 5密钥生成实用指南&#xff1a;3步完成永久授权配置 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 面对Beyond Compare 5商业版的高昂授权费用&#xff0c;许多开发者都在寻求经…

健身动作矫正系统:骨骼点检测+规则引擎预装镜像实测

健身动作矫正系统&#xff1a;骨骼点检测规则引擎预装镜像实测 引言&#xff1a;让AI成为你的私人健身教练 想象一下这样的场景&#xff1a;当你独自在家做深蹲时&#xff0c;有个24小时在线的智能教练实时提醒你"膝盖不要超过脚尖"、"背部保持挺直"。这…

Zotero PDF预览插件完整指南:高效文献管理解决方案

Zotero PDF预览插件完整指南&#xff1a;高效文献管理解决方案 【免费下载链接】zotero-pdf-preview Preview Zotero attachments in the library view. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-pdf-preview 在现代学术研究中&#xff0c;PDF预览功能已成为…

Beyond Compare 5如何实现永久授权?专业文件对比工具破解方案详解

Beyond Compare 5如何实现永久授权&#xff1f;专业文件对比工具破解方案详解 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 在软件开发过程中&#xff0c;文件对比工具是每个开发者不可或缺的…