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

Qt之多线程和并发_P3

本节主要介绍线程局部存储和C++中的原子操作,其主要目的是尽可能少的使用互斥锁其他的同步机制,简化程序。

文章目录

  • 线程局部存储(Thread Local Storage, TLS)
  • 原子操作
    • C++中的原子操作
      • 核心类型
      • 内存序
      • 基本操作

线程局部存储(Thread Local Storage, TLS)

QThreadStorage是Qt提供的线程局部存储(Thread Local Storage, TLS)工具类,它是一个模板类,用于提供每个线程独享的数据存储。
常用的方法包括:

  • setLocalData():设置存储值
  • localData():访问存储值
  • hasLocalData():判断是否设置过存储值

setLocalData()函数会为调用线程存储一个线程专属的值;稍后可以通过localData()来访问该数据。hasLocalData()函数允许程序员判断当前线程之前是否已经通过setLocalData()设置过数据。这对于延迟初始化(lazy initialization)非常有用。
如果T是一个指针类型,QThreadStorage会接管这块数据的所有权(该数据必须通过new在堆上创建),并在线程退出时自动删除这些数据,无论线程是正常退出还是被终止。

QThreadStorage的析构函数 不会删除 每个线程的数据。QThreadStorage只会在 线程退出 时,或调用setLocalData()多次时,才会删除对应线程的数据。QThreadStorage也可以用于存储main()主线程 的数据。无论主线程是否真正结束,只要QApplication被销毁,QThreadStorage都会删除为主线程设置的所有数据。

struct HeavyContext { HeavyContext() { qDebug() << "init HeavyContext in thread" << QThread::currentThread(); } ~HeavyContext() { qDebug() << "destroy HeavyContext in thread" << QThread::currentThread(); } int value = 0; }; // 用指针类型:QThreadStorage 对线程结束时的析构做了处理,会自动 delete T* static QThreadStorage<HeavyContext*> g_ctx; class Worker : public QThread { void run() override { // 首次访问时初始化本线程的数据 if (!g_ctx.hasLocalData()) { g_ctx.setLocalData(new HeavyContext()); } // 使用本线程自己的数据 g_ctx.localData()->value++; qDebug() << "thread" << QThread::currentThread() << "value =" << g_ctx.localData()->value; // 不需要手动 delete,线程结束时 QThreadStorage 会负责销毁 } }; int main(int argc, char* argv[]) { QCoreApplication app(argc, argv); Worker t1, t2, t3; t1.start(); t2.start(); t3.start(); t1.wait(); t2.wait(); t3.wait(); return 0; }

上述代码打印结果如下:

init HeavyContext in thread QThread(0x235f4ffac8) init HeavyContext in thread QThread(0x
http://www.jsqmd.com/news/351491/

相关文章:

  • 计算机小程序毕设实战-基于springboot+安卓的智慧医疗系统设计与实现电子病历、在线问诊、健康监测、就医服务与健康科普【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2026降AI工具第一梯队盘点:研究生室友都在用的降AIGC率方案 - 还在做实验的师兄
  • Qt 6.10.1 安装与 Android 配置_桌面 _真机 _虚拟机完整流程 (下)(Qt到期了 演示如何处理)
  • CANN Runtime 运行时与维测组件:异构任务调度、显存池管理与全链路异常诊断机制解析
  • 2026年SCI期刊AI率审查越来越严?这4款降AI工具学术圈在用 - 还在做实验的师兄
  • 小程序毕设选题推荐:基于springboot+安卓的智慧医疗系统设计与实现基于springboot智慧医疗APP健康数据监测、智能提醒、远程咨询【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 微信小程序真机调试访问本地接口失败?用 natapp 做内网穿透(踩坑总结,超详细)
  • 2026免费降AI率工具哪个好?毕业生亲测4款不花钱也能过 - 还在做实验的师兄
  • Anthropic明确拒绝在Claude中加入广告功能
  • 破解低温加热难题|这款纹波加热电源,重新定义高效节能新标杆
  • 容器日志的存储方式,目前业界公认的最佳实践
  • 谷歌为BigQuery增添对话式智能体和自定义工具
  • 2026降AI工具红黑榜:花了500块测了8款,只推荐这3个 - 还在做实验的师兄
  • Qt 6.10.1 安装与 Android 配置_桌面 _真机 _虚拟机完整流程(下) -(Qt到期了 演示如何处理)
  • 小程序计算机毕设之基于springboot+安卓的智慧医疗系统设计与实现基于Android的智慧医疗问诊系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 2026年自媒体去AI味用什么工具?实测5款让AI文案像人写的 - 还在做实验的师兄
  • 2026年论文降AI后学术性太弱怎么办?这几款工具降完还能保质量 - 还在做实验的师兄
  • 深入解析:.NET - .NET Aspire的Command-Line和GitHub Copilot
  • Java高频面试题:Spring和SpringBoot的关系和区别?
  • 【案例】PostgreSQL修改表属主报错分析
  • SQLite 表达式详解
  • Shell test 命令详解
  • Qt 6.10.1 安装与 Android 配置_桌面 _真机 _虚拟机完整流程(下) -(到期了 演示如何处理)
  • 小程序毕设项目推荐-基于Vue+Node.js的民艺探索传承之旅文化展示、互动传播微信小程序设计【附源码+文档,调试定制服务】
  • AI时代最稀缺的能力,应该是品味?
  • 小程序毕设选题推荐:基于Vue+Node.js的民艺探索传承之旅小程序设计基于微信小程序的民艺探索传承之旅系统艺术资源【附源码、mysql、文档、调试+代码讲解+全bao等】
  • C# 结构体(Struct)
  • 计算机小程序毕设实战-基于Vue+Node.js的民艺探索传承之旅微信小程序设计【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • mss 截图所有的显示器 python
  • 2026年毕业论文AI率降不到20%以下?试试这3款降AI工具 - 还在做实验的师兄