北京公司网站如何制作成都网页制作服务好
2026/4/6 5:57:22 网站建设 项目流程
北京公司网站如何制作,成都网页制作服务好,自己编辑网站怎么做,wordpress自定义筛选一、纯C实现线程的方式#xff08;C11及以上#xff09;纯C的线程能力来自标准库#xff08;thread#xff09;#xff0c;核心只有2类核心方式#xff08;本质都是基于std::thread#xff09;#xff0c;没有多余的“变种”#xff0c;语法和平台无关#x…一、纯C实现线程的方式C11及以上纯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::functionvoid() task; // 加锁取任务 { std::unique_lockstd::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(); } }); } } // 添加任务到队列 templateclass F void enqueue(F f) { { std::unique_lockstd::mutex lock(m_mtx); m_tasks.emplace(std::forwardF(f)); } m_cv.notify_one(); // 唤醒一个线程执行任务 } // 销毁线程池 ~ThreadPool() { { std::unique_lockstd::mutex lock(m_mtx); m_stop true; } m_cv.notify_all(); // 唤醒所有线程 for (auto worker : m_workers) { if (worker.joinable()) worker.join(); } } private: std::vectorstd::thread m_workers; // 线程池 std::queuestd::functionvoid() 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(); // 等待线程结束方式2QObject 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);方式3Qt线程池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::threadQt线程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多线程场景总结纯C线程只有2类核心方式std::thread直接使用、基于std::thread封装线程池语法通用但需手动处理线程通信和管理Qt线程有3种核心方式继承QThread、QObjectmoveToThread、QThreadPool底层基于C但封装了Qt生态特性信号槽、自动管理是Qt项目的首选二者底层原理相同都是操作系统线程但封装形式和使用场景完全不同——Qt线程是纯C线程在Qt生态下的“定制增强版”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询