8.线程的创建方法

一、纯C++实现线程的方式(C++11及以上)

纯C++的线程能力来自标准库(<thread>),核心只有2类核心方式(本质都是基于std::thread),没有多余的“变种”,语法和平台无关(Windows/Linux通用):

1. 基础方式:直接使用std::thread绑定可执行对象

这是最核心的方式,std::thread创建后立即启动新线程,可绑定函数、lambda、类成员函数等:

#include <thread> #include <iostream> #include <chrono> // 1. 绑定普通函数 void task1(int num) { for (int i = 0; i < 3; ++i) { std::cout << "任务1(线程ID:" << std::this_thread::get_id() << "):" << num + i << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(500)); } } // 2. 绑定类成员函数 class TaskClass { public: void task2(const std::string& msg) { for (int i = 0; i < 3; ++i) { std::cout << "任务2(线程ID:" << std::this_thread::get_id() << "):" << msg << i << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(500)); } } }; int main() { std::cout << "主线程ID:" << std::this_thread::get_id() << std::endl; // 方式1:启动普通函数线程 std::thread t1(task1, 10); // 方式2:启动类成员函数线程 TaskClass obj; std::thread t2(&TaskClass::task2, &obj, "测试"); // 等待线程结束(必须join,否则主线程退出会导致程序崩溃) t1.join(); t2.join(); return 0; }
2. 进阶方式:线程池(基于std::thread封装)

纯C++没有内置线程池,需自己封装或用第三方库(如boost::thread_pool),核心是复用线程、减少线程创建销毁的开销,适合大量短任务场景:

// 简化版线程池示例(核心思路) #include <thread> #include <vector> #include <queue> #include <mutex> #include <condition_variable> class ThreadPool { public: ThreadPool(int numThreads) { // 创建指定数量的线程,循环等待任务 for (int i = 0; i < numThreads; ++i) { m_workers.emplace_back([this]() { while (true) { std::function<void()> task; // 加锁取任务 { std::unique_lock<std::mutex> lock(m_mtx); m_cv.wait(lock, [this]() { return m_stop || !m_tasks.empty(); }); if (m_stop && m_tasks.empty()) return; task = std::move(m_tasks.front()); m_tasks.pop(); } // 执行任务 task(); } }); } } // 添加任务到队列 template<class F> void enqueue(F&& f) { { std::unique_lock<std::mutex> lock(m_mtx); m_tasks.emplace(std::forward<F>(f)); } m_cv.notify_one(); // 唤醒一个线程执行任务 } // 销毁线程池 ~ThreadPool() { { std::unique_lock<std::mutex> lock(m_mtx); m_stop = true; } m_cv.notify_all(); // 唤醒所有线程 for (auto& worker : m_workers) { if (worker.joinable()) worker.join(); } } private: std::vector<std::thread> m_workers; // 线程池 std::queue<std::function<void()>> m_tasks; // 任务队列 std::mutex m_mtx; // 互斥锁 std::condition_variable m_cv; // 条件变量 bool m_stop = false; // 停止标志 }; // 使用线程池 int main() { ThreadPool pool(4); // 创建4个线程的线程池 for (int i = 0; i < 10; ++i) { pool.enqueue([i]() { std::cout << "线程池执行任务" << i << ",线程ID:" << std::this_thread::get_id() << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(100)); }); } return 0; }

二、Qt框架中实现线程的方式(3种核心方式)

Qt基于纯C++扩展了线程能力,核心有3种方式,底层仍依赖操作系统线程,但封装了更贴合Qt生态的接口(信号槽、事件循环)

方式1:继承QThread重写run()(基础方式)
  • 核心:QThread是线程控制器,重写run()函数,run()内的代码在新线程执行;
  • 适用:简单、单一的循环任务(如持续采集传感器数据);
  • 示例:
#include <QThread> #include <QDebug> class SimpleThread : public QThread { Q_OBJECT protected: void run() override { for (int i = 0; i < 3; ++i) { qDebug() << "QThread线程执行:" << i << ",线程ID:" << QThread::currentThreadId(); msleep(500); // Qt封装的延时(避免用std::this_thread) } } }; // 使用 // SimpleThread t; // t.start(); // 启动线程,自动调用run() // t.wait(); // 等待线程结束
方式2:QObject + moveToThread()(Qt官方推荐,主流方式)
  • 核心:将业务逻辑封装在QObject子类中,通过moveToThread()移到QThread,用信号槽触发任务,解耦“线程管理”和“业务逻辑”;
  • 适用:绝大多数场景(网络通信、异步解析、多任务调度);
  • 示例:
#include <QThread> #include <QObject> #include <QDebug> class Worker : public QObject { Q_OBJECT public slots: void doWork() { qDebug() << "moveToThread执行任务,线程ID:" << QThread::currentThreadId(); // 耗时任务逻辑... } }; // 使用 // QThread thread; // Worker* worker = new Worker; // worker->moveToThread(&thread); // thread.start(); // // 信号槽触发任务 // QMetaObject::invokeMethod(worker, "doWork");
方式3:Qt线程池QThreadPool(进阶方式)
  • 核心:Qt内置线程池,无需手动封装,结合QRunnable使用,适合大量短任务;
  • 适用:批量处理小任务(如批量解析数据、批量网络请求);
  • 示例:
#include <QThreadPool> #include <QRunnable> #include <QDebug> class MyRunnable : public QRunnable { public: void run() override { qDebug() << "QThreadPool执行任务,线程ID:" << QThread::currentThreadId(); // 任务逻辑... } }; // 使用 // MyRunnable* runnable = new MyRunnable; // runnable->setAutoDelete(true); // 执行完自动销毁 // QThreadPool::globalInstance()->start(runnable); // 加入全局线程池执行

三、纯C++线程 vs Qt线程:核心差异(是否相同?)

二者底层原理相同(都是调用操作系统的线程接口),但封装形式、生态适配、使用方式完全不同,核心差异如下:

维度

纯C++线程(std::thread)

Qt线程(QThread/QThreadPool)

核心依赖

C++标准库<thread>,跨平台但无Qt生态适配

基于C++扩展,绑定Qt信号槽、事件循环

线程通信

需手动用std::mutex/std::condition_variable,无现成通信机制

天然支持信号槽(线程间安全通信),无需手动处理锁

线程管理

手动join()/detach(),无内置线程池

自动管理(如QThread::start()/wait()),内置QThreadPool

生态适配

无法直接和Qt控件/信号槽交互

完美适配Qt所有模块(UI、网络、文件等)

适用场景

非Qt项目、纯C++跨平台项目

Qt项目(99%的Qt多线程场景)

总结

  1. 纯C++线程:只有2类核心方式(std::thread直接使用、基于std::thread封装线程池),语法通用但需手动处理线程通信和管理;
  2. Qt线程:有3种核心方式(继承QThread、QObject+moveToThread、QThreadPool),底层基于C++但封装了Qt生态特性(信号槽、自动管理),是Qt项目的首选;
  3. 二者底层原理相同(都是操作系统线程),但封装形式和使用场景完全不同——Qt线程是纯C++线程在Qt生态下的“定制增强版”。

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

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

相关文章

Docker零基础入门:从安装到第一个容器只需30分钟

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式Docker学习应用&#xff0c;包含&#xff1a;1. 分步安装向导(Windows/Mac/Linux) 2. 基础命令模拟终端 3. 可视化容器状态展示 4. 新手常见问题解答 5. 实践小任务…

元宇宙基础:实时多人姿态估计方案选型

元宇宙基础&#xff1a;实时多人姿态估计方案选型 引言&#xff1a;为什么元宇宙需要姿态估计&#xff1f; 想象一下&#xff0c;当你戴上VR眼镜进入元宇宙世界时&#xff0c;你的虚拟化身能够实时跟随你的动作点头、挥手甚至跳舞——这就是姿态估计技术的魔力。作为元宇宙的…

AI助力FPGA开发:Vivado下载与智能代码生成

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个基于AI的FPGA开发辅助工具&#xff0c;能够根据用户需求自动生成Verilog/VHDL代码片段&#xff0c;优化Vivado项目配置&#xff0c;并提供实时错误检测和性能建议。工具应…

从零构建语义搜索引擎,手把手教你用向量数据库提升召回率

第一章&#xff1a;从零开始理解语义搜索的核心挑战传统的关键词匹配搜索依赖于字面匹配&#xff0c;而语义搜索则致力于理解用户查询背后的意图与上下文。这一转变带来了诸多技术挑战&#xff0c;尤其是在自然语言的多义性、上下文依赖和知识表示方面。自然语言的歧义性 人类语…

3分钟快速部署青龙面板:QLDependency一键依赖安装终极指南

3分钟快速部署青龙面板&#xff1a;QLDependency一键依赖安装终极指南 【免费下载链接】QLDependency 青龙面板全依赖一键安装脚本 / Qinglong Pannel Dependency Install Scripts. 项目地址: https://gitcode.com/gh_mirrors/ql/QLDependency 还在为青龙面板的依赖配置…

AI如何优化HIVE大数据查询效率?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于AI的HIVE查询优化工具&#xff0c;能够自动分析查询语句&#xff0c;推荐最优执行计划&#xff0c;并动态调整资源配置。功能包括&#xff1a;1. 查询语句解析和模式识…

Z-Image-Turbo快速入门:5分钟部署ComfyUI工作流,新手友好

Z-Image-Turbo快速入门&#xff1a;5分钟部署ComfyUI工作流&#xff0c;新手友好 引言&#xff1a;艺术生的AI创作救星 作为一名艺术专业的学生&#xff0c;你可能经常需要创作各种视觉作品来完成作业。现在AI绘画工具可以成为你的得力助手&#xff0c;但像ComfyUI这样的专业…

MouseTester完全指南:快速掌握鼠标性能精准测试技巧

MouseTester完全指南&#xff1a;快速掌握鼠标性能精准测试技巧 【免费下载链接】MouseTester 项目地址: https://gitcode.com/gh_mirrors/mo/MouseTester 想要知道你的鼠标是否真的给力&#xff1f;MouseTester这款专业工具帮你一探究竟&#xff01;无论你是游戏发烧友…

数字华夏十年演进(2015–2025)

数字华夏十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年数字华夏还“不存在”&#xff08;仅国家大数据战略初步布局&#xff09;&#xff0c;2025年已进化成“全球最强数字中国底座万亿级多模态VLA时空智能大模型量子鲁棒自进化全域政务/民生/产业…

Proxmox VE管理利器:pvetools 5分钟快速上手指南

Proxmox VE管理利器&#xff1a;pvetools 5分钟快速上手指南 【免费下载链接】pvetools pvetools - 为 Proxmox VE 设计的脚本工具集&#xff0c;用于简化邮件、Samba、NFS、ZFS 等配置&#xff0c;以及嵌套虚拟化、Docker 和硬件直通等高级功能&#xff0c;适合系统管理员和虚…

人体关键点检测避坑大全:环境配置/显存不足/精度提升一次讲清

人体关键点检测避坑大全&#xff1a;环境配置/显存不足/精度提升一次讲清 1. 为什么你需要这份指南 最近接了个外包项目&#xff0c;客户要求实现人体关键点检测功能。作为刚转行AI的开发者&#xff0c;你可能遇到了这些典型问题&#xff1a; 本地显卡跑不动大batchsize&…

对比传统方式:FASTMCP文档生成效率提升300%

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个API文档生成效率对比工具&#xff0c;要求&#xff1a;1. 内置计时功能记录文档创建时间 2. 自动检测文档完整性&#xff08;参数覆盖率、示例完整性等&#xff09; 3. 生…

LSTM在智能客服中的实际应用案例解析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于LSTM的智能客服对话系统。功能要求&#xff1a;1. 使用TensorFlow/Keras实现 2. 包含用户意图分类模块&#xff08;至少5类常见问题&#xff09; 3. 实现对话情感分析…

企业级项目中包管理冲突实战解决方案

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个案例研究应用&#xff0c;展示一个真实的企业级项目因包更新失败和依赖冲突导致构建失败的场景。详细记录问题现象、错误日志分析过程、依赖关系图谱可视化、最终解决方案…

如何用AI快速解析TRAE CN数据并生成可视化报告

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个Python项目&#xff0c;使用Pandas和Matplotlib分析TRAE CN数据集。首先加载CSV格式的数据文件&#xff0c;进行数据清洗和预处理&#xff0c;然后生成关键指标的统计摘要…

人体关键点检测省钱攻略:云端GPU按需付费,比买显卡省90%

人体关键点检测省钱攻略&#xff1a;云端GPU按需付费&#xff0c;比买显卡省90% 1. 为什么康复中心需要人体关键点检测 想象一下&#xff0c;当康复师分析患者的步态时&#xff0c;需要像福尔摩斯一样观察每个关节的细微变化——膝盖弯曲角度是否正常&#xff1f;肩膀摆动是否…

GLM-4.6V-Flash-WEB API返回空?输入格式避坑指南

GLM-4.6V-Flash-WEB API返回空&#xff1f;输入格式避坑指南 智谱最新开源&#xff0c;视觉大模型。 1. 背景与问题定位 1.1 GLM-4.6V-Flash-WEB 简介 GLM-4.6V-Flash-WEB 是智谱AI推出的最新开源视觉语言大模型&#xff08;Vision-Language Model, VLM&#xff09;&#xff…

5个最火AI绘画镜像推荐:Z-Image-ComfyUI开箱即用

5个最火AI绘画镜像推荐&#xff1a;Z-Image-ComfyUI开箱即用 1. 为什么需要预置AI绘画镜像&#xff1f; 对于AI课程学员或刚接触AI绘画的新手来说&#xff0c;最头疼的问题莫过于环境配置。传统方式需要自行安装CUDA、PyTorch、模型文件等组件&#xff0c;光是解决依赖冲突就…

OneMore插件深度指南:从入门到精通的完整学习路径

OneMore插件深度指南&#xff1a;从入门到精通的完整学习路径 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore OneMore插件作为OneNote的强大扩展工具&#xff0c;通过…

VS Code插件对比:谁生成linear-gradient最快?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 制作一个渐变工具效率测试器&#xff1a;1) 记录用户从零开始创建特定渐变效果的操作步骤数2) 计时不同工具完成相同任务的时间3) 分析生成代码的简洁度和兼容性4) 生成对比雷达图…