• C++ 线程池


    在C++中,线程池是一种用于管理和复用线程的机制,以减少线程创建和销毁的开销,并提高系统的响应速度和吞吐量。下面是一个简单的C++线程池实现的概述:

    线程池设计
    线程池大小:确定线程池中线程的数量。
    任务队列:用于存储待执行的任务。
    线程管理:创建、启动、管理和销毁线程。
    任务调度:从任务队列中取出任务并分配给空闲线程执行。

    示例如下:

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. class ThreadPool
    11. {
    12. public:
    13. ThreadPool(size_t count);
    14. ~ThreadPool();
    15. ThreadPool(const ThreadPool&) = delete; //禁用拷贝构造
    16. const ThreadPool& operator=(const ThreadPool&) = delete; //禁用赋值运算符
    17. void threadLoop();
    18. void addTask(std::function<void()> &task);
    19. private:
    20. std::vector _threads;
    21. std::queuevoid()>> _tasks;
    22. std::mutex _mtx;
    23. std::condition_variable _cv;
    24. bool _stop;
    25. };

    1. #include "ThreadPool.h"
    2. ThreadPool::ThreadPool(size_t count): _stop(false)
    3. {
    4. _threads.reserve(count);
    5. for (size_t i = 0; i < count; ++i)
    6. {
    7. _threads.emplace_back(
    8. new std::thread(std::bind(&ThreadPool::threadLoop, this))
    9. );
    10. }
    11. }
    12. ThreadPool::~ThreadPool()
    13. {
    14. std::unique_lock lock(_mtx);
    15. _stop = true;
    16. _cv.notify_all();
    17. for (auto it = _threads.begin(); it != _threads.end(); ++it)
    18. {
    19. (*it)->join();
    20. delete *it;
    21. }
    22. _threads.clear();
    23. }
    24. void ThreadPool::threadLoop()
    25. {
    26. while (!_stop)
    27. {
    28. std::unique_lock lock(_mtx);
    29. if(_tasks.empty())
    30. _cv.wait(lock);
    31. if (!_tasks.empty())
    32. {
    33. std::function<void()> task = _tasks.front();
    34. _tasks.pop();
    35. task(); //执行任务
    36. }
    37. }
    38. }
    39. void ThreadPool::addTask(std::function<void()> &task)
    40. {
    41. std::unique_lock lock(_mtx);
    42. _tasks.emplace(task);
    43. _cv.notify_one();
    44. }

    Qt线程池:

    Qt 提供了一个线程池(QThreadPool)来简化多线程编程。只需将任务(通常是以 QRunnable 或其子类形式的任务)提交给线程池,然后由线程池自动处理任务的分配和执行。
    以下是使用 Qt 线程池的基本步骤:

    1、包含必要的头文件

    1. #include  
    2. #include

    2、创建自定义任务
    创建一个继承自 QRunnable 的类,并实现 run() 方法。这个方法将包含你的任务代码。

    1. class MyTask : public QRunnable
    2. {
    3. public:
    4. void run() override {
    5. // 在这里编写你的任务代码
    6. }
    7. };

    3、提交任务到线程池
    使用 QThreadPool::globalInstance() 获取全局线程池的实例,然后调用 start() 方法来提交任务。

    1. MyTask *task = new MyTask();
    2. QThreadPool::globalInstance()->start(task);
    3. // 注意:task 对象将在任务完成后自动删除,除非你设置了不同的删除策略

    4、配置线程池
    你可以使用 QThreadPool 的各种方法来配置线程池的行为,例如设置最大线程数:

    QThreadPool::globalInstance()->setMaxThreadCount(4); // 设置最大线程数为 4

    5、处理任务结果
    如果你的任务需要返回结果,你可以使用信号和槽机制来在任务完成时发送结果。在你的 QRunnable 子类中,当任务完成时发出一个信号,然后在需要的地方连接这个信号到一个槽。

    6、线程安全
    在多线程环境中编程时,确保你的代码是线程安全的。避免在多个线程中同时访问和修改共享数据,除非你已经采取了适当的同步措施(如互斥锁)。

    7、清理和关闭
    当应用程序关闭时,Qt 将自动清理和关闭线程池。然而,如果你需要手动关闭线程池或等待所有任务完成,你可以使用 QThreadPool 的相关方法。
    注意:Qt 线程池非常适合处理简单的并行任务,但对于复杂的并发需求(如需要精确控制线程生命周期或同步的情况),你可能需要直接使用 QThread 或其他更底层的并发机制。
     

  • 相关阅读:
    Mac环境下反编译apk
    C 嵌入式系统设计模式 08:硬件代理模式
    VEX —— Intrinsic attribute
    【李宏毅机器学习】Explainable AI
    suricata 流管理
    kafka生产者和消费者(python版)
    【已解决】Git下载私有仓库时报错Authentication failed
    【应用笔记】Sub-1G系列产品CW32W031单片机CAD应用参考
    【python自动化】playwright长截图&切换标签页&JS注入实战
    【linux问题记录】
  • 原文地址:https://blog.csdn.net/wy749929317/article/details/139739655