news 2026/8/20 12:56:05

8.线程的创建方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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生态下的“定制增强版”。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 10:29:33

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

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

作者头像 李华
网站建设 2026/8/19 5:16:59

WarcraftHelper完全指南:免费解锁魔兽争霸III隐藏功能

WarcraftHelper完全指南&#xff1a;免费解锁魔兽争霸III隐藏功能 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专门为魔兽争霸…

作者头像 李华
网站建设 2026/8/8 20:56:21

穹彻十年演进(2015–2025)

穹彻十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年穹彻还“不存在”&#xff08;仅实验室四足机器人概念&#xff09;&#xff0c;2025年已进化成“全球领先高速拟人四足机器人万亿级VLA端到端意图级控制量子鲁棒自进化全域安防/救援/巡检/陪伴伙…

作者头像 李华
网站建设 2026/7/26 9:24:29

【自动化革命核心武器】:为什么顶尖公司都在用RPA结合Python?

第一章&#xff1a;RPA与Python协同自动化的战略价值在企业数字化转型加速的背景下&#xff0c;RPA&#xff08;机器人流程自动化&#xff09;与Python的深度集成正成为提升运营效率的关键策略。RPA擅长模拟用户操作&#xff0c;处理基于规则的重复性任务&#xff0c;而Python则…

作者头像 李华
网站建设 2026/8/20 9:55:04

小白也能懂:Qwen3-4B保姆级API调用教程

小白也能懂&#xff1a;Qwen3-4B保姆级API调用教程 1. 引言&#xff1a;为什么你需要这个教程&#xff1f; 在当前大模型快速发展的背景下&#xff0c;越来越多开发者希望将强大的语言模型集成到自己的应用中。然而&#xff0c;面对复杂的部署流程、API调用方式和框架选择&am…

作者头像 李华
网站建设 2026/8/7 16:48:15

MouseTester完整使用指南:专业鼠标性能测试从入门到精通

MouseTester完整使用指南&#xff1a;专业鼠标性能测试从入门到精通 【免费下载链接】MouseTester 项目地址: https://gitcode.com/gh_mirrors/mo/MouseTester MouseTester是一款专业的鼠标性能测试工具&#xff0c;能够帮助用户准确评估鼠标的各项性能指标&#xff0c…

作者头像 李华