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

C++ 线程池

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

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

示例如下:

#pragma once
#include <iostream>  
#include <vector>  
#include <queue>  
#include <thread>  
#include <mutex>  
#include <condition_variable>  
#include <functional>  
#include <future> class ThreadPool
{
public:ThreadPool(size_t count);~ThreadPool();ThreadPool(const ThreadPool&) = delete; //禁用拷贝构造const ThreadPool& operator=(const ThreadPool&) = delete; //禁用赋值运算符void threadLoop();void addTask(std::function<void()> &task);private:std::vector<std::thread*> _threads;std::queue<std::function<void()>> _tasks;std::mutex _mtx;std::condition_variable _cv;bool _stop;
};

#include "ThreadPool.h"ThreadPool::ThreadPool(size_t count): _stop(false)
{_threads.reserve(count);for (size_t i = 0; i < count; ++i){_threads.emplace_back(new std::thread(std::bind(&ThreadPool::threadLoop, this)));}
}ThreadPool::~ThreadPool()
{std::unique_lock<std::mutex> lock(_mtx);_stop = true;_cv.notify_all();for (auto it = _threads.begin(); it != _threads.end(); ++it){(*it)->join();delete *it;}_threads.clear();
}void ThreadPool::threadLoop()
{while (!_stop){std::unique_lock<std::mutex> lock(_mtx);if(_tasks.empty())_cv.wait(lock);if (!_tasks.empty()){std::function<void()> task = _tasks.front();_tasks.pop();task();  //执行任务}}
}void ThreadPool::addTask(std::function<void()> &task)
{std::unique_lock<std::mutex> lock(_mtx);_tasks.emplace(task);_cv.notify_one();
}

Qt线程池:

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

1、包含必要的头文件

#include <QThreadPool>  
#include <QRunnable>

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

class MyTask : public QRunnable  
{  
public:  void run() override {  // 在这里编写你的任务代码  }  
};

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

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

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

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

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

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

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

相关文章:

  • 盘点:20个大幅提高效率的开源网络安全工具
  • MongoDB 索引
  • Springboot + Mybatis 实现sql打印
  • 鸿蒙正在跨越“生态繁荣阈值”
  • 大语言模型-Transformer
  • html做一个分组散点图图的软件
  • 韩顺平0基础学java——第28天
  • Elasticsearch-ES查询单字段去重
  • 34.构建核心注入代码
  • C++ 61 之 函数模版
  • 【八股系列】shouldComponentUpdate是为了解决什么问题?(React)
  • CentOS OpenVPN 客户端连接配置
  • 椭圆的几何要素
  • 计算机专业的发展前景与选择建议。
  • 主流框架选择:React、Angular、Vue的详细比较
  • [case10]使用RSQL实现端到端的动态查询
  • Babel配置的不完全指南
  • DataBase in Android
  • Druid 在有赞的实践
  • eclipse的离线汉化
  • Flex布局到底解决了什么问题
  • in typeof instanceof ===这些运算符有什么作用
  • laravel 用artisan创建自己的模板
  • Mac转Windows的拯救指南
  • nginx 负载服务器优化
  • PHP 7 修改了什么呢 -- 2
  • Python进阶细节
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React-Native - 收藏集 - 掘金
  • Redis在Web项目中的应用与实践
  • SegmentFault 2015 Top Rank
  • 阿里云前端周刊 - 第 26 期
  • 创建一种深思熟虑的文化
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 用 Swift 编写面向协议的视图
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Mac 上flink的安装与启动
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​【已解决】npm install​卡主不动的情况
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # 透过事物看本质的能力怎么培养?
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (13):Silverlight 2 数据与通信之WebRequest
  • (done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)
  • (JS基础)String 类型
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (转)ObjectiveC 深浅拷贝学习
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .ai域名是什么后缀?
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net FrameWork简介,数组,枚举
  • .Net Web窗口页属性
  • .NET 表达式计算:Expression Evaluator