C++线程池

使用线程情况比较频繁的地方,由于线程的创建及销毁都会产生对资源的占用及性能的损耗。为了优化性能,提升效率,在这种场景中,就应该使用线程池来处理任务。

线程池创建的关键点:
  1. 装载线程的容器,在C++中使用vector
  2. 装载任务的容器,一般使用队列,满足先进先出的特性
  3. 读写任务队列时,需要使用互斥锁,防止多线程读写异常
  4. 线程保活的无限循环中,需要添加一个有任务时运行,无任务时停止的控制器,防止CPU空转。在C++中使用条件变量
  5. 线程启停标识

依据以上关键点,开始编写相应的代码。首次创建线程池类,一般情况下,该类是单例类。

ThreadPool.h

#ifndef THREAD_POOL_H
#define THREAD_POOL_H#include <thread>
#include <vector>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>class ThreadPool {public: static ThreadPool* GetInstance(int number);private:ThreadPool(int number);~ThreadPool();public:template<typename F, typename... Args>void AddTask(F&& func, Args&&... args){std::unique_lock<std::mutex> lock(m_Mutex);std::function<void()> task = std::bind(std::forward<F> func, std::forward<Args>(args)...);m_TaskQueue.emplace(std::move(task));lock.unlock();m_CV.notify_one();}private:// first: thread container// second: task queue// third: task queue mutex lock// forth: thread keep alive condition varible// fifth: thread start/stop flag// sixth: storage thread countstd::vector<std::thread> m_Threads;std::queue<std::function<void()>> m_TaskQueue;std::mutex m_Mutex;std::condition_variable m_CV;bool m_IsRunning;int m_ThreadNum;
};#endif
#include "ThreadPool.h"static ThreadPool *pInstance = nullptr;
static std::once_flag flag1;ThreadPool *ThreadPool::GetInstance(int number)
{std::call_once(flag1, [number](){pInstance = new ThreadPool(number);});return pInstance;
}ThreadPool::ThreadPool(int number): m_ThreadNum(number), m_IsRunning(true)
{m_Threads.push_back(std::thread([this](){while (true) // thread keep alive{std::unique_lock<std::mutex> lock(m_Mutex);m_CV.wait(lock, [this](){bool isEmpty = m_TaskQueue.empty();// task is not empty or thread stoppedreturn !isEmpty || !m_IsRunning;});if (!m_IsRunning)// thread stop{break;}auto task = m_TaskQueue.front();m_TaskQueue.pop();lock.unlock();task();}}));
}ThreadPool::~ThreadPool()
{{std::unique_lock<std::mutex> lock(m_Mutex);m_IsRunning = false;}m_CV.notify_all();for (auto &t : m_Threads){if (t.joinable()){t.join();}}
}

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

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

相关文章

一周发生AI事件总结(02.08)

本周人工智能领域发生的所有事件&#xff1a; Ilya Sutskever的初创公司正洽谈以约200亿美元估值进行融资&#xff1a;据路透社报道&#xff0c;由前OpenAI首席科学家Ilya Sutskever创立的人工智能初创公司Safe Superintelligence正洽谈以“至少”200亿美元的估值进行融资。该…

FFmpeg(一) 简介

FFmpeg 官网 FFmpeg 下载 ffmpeg-release-essentials.7z ffmpeg-release-full-shared.7z FFmpeg既是一款音视频编解码工具&#xff0c;同时也是一组音社频编解码开发套件 FFmpeg包含 多种音视频编码多种协议的流媒体多种色彩格式转换多种采样率转换多种码率转换多种丰富的…

Android内存性能优化量化指标

在 Android 开发中&#xff0c;对内存性能进行优化至关重要&#xff0c;这有助于提升应用的稳定性和流畅度&#xff0c;避免因内存问题导致的卡顿、崩溃等现象。以下是一些常见的 Android 内存性能优化量化指标&#xff1a; 内存占用指标 堆内存使用量 定义&#xff1a;堆内…

linux 基础知识点之工作队列workqueue

多年前就了解了workqueue着玩意&#xff0c;但理解上就并不是很很深刻&#xff0c;今天重新梳理一下&#xff0c;本文重点的是哪个些现成的demo代码&#xff0c;都是可以直接拿来用的&#xff0c;这就是写这文章的目的和作用&#xff0c;就是为了备份后续工作用到的时候&#x…

【CubeMX+STM32】SD卡 文件系统读写 FatFs+SDIO+DMA

本篇&#xff0c;将使用CubeMXKeil&#xff0c;创建一个SD卡的 FatFSSDIODMA 文件系统读写工程。 目录 一、简述 二、CubeMX 配置 FatFSSDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、简述 上两篇&#xff0c;已循序渐进讲解了SD、…

docker环境下部署face-search开源人脸识别模型

由于我们是直接将face-search部署在docker容器中的,所以,在部署之前一定要检查一下自己的docker环境,要不然部署过程中会出现各种各样的问题 我这里的docker环境是 一、安装docker环境 如果docker版本比较低或者docker-compose的版本比较低的情况下,部署的时候docker的yml…

【Android开发AI实战】选择目标跟踪基于opencv实现——运动跟踪

文章目录 【Android 开发 AI 实战】选择目标跟踪基于 opencv 实现 —— 运动跟踪一、引言二、Android 开发与 AI 的融合趋势三、OpenCV 简介四、运动跟踪原理&#xff08;一&#xff09;光流法&#xff08;二&#xff09;卡尔曼滤波&#xff08;三&#xff09;粒子滤波 五、基于…

消费电子产品中的噪声对TPS54202的影响

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、概述 在白色家电领域&#xff0c;降压转换器的应用非常广泛&#xff0c;为了实现不同的功能就需要不同的电源轨。TPS542…

5、大模型的记忆与缓存

文章目录 本节内容介绍记忆Mem0使用 mem0 实现长期记忆 缓存LangChain 中的缓存语义缓存 本节内容介绍 本节主要介绍大模型的缓存思路&#xff0c;通过使用常见的缓存技术&#xff0c;降低大模型的回复速度&#xff0c;下面介绍的是使用redis和mem0&#xff0c;当然redis的语义…

用 Python 给 Excel 表格截图(20250207)

我搜索了网络上的方案&#xff0c;感觉把 Excel 表格转换为 HTML 再用 platwright 截图是比较顺畅的路径&#xff0c;因为有顺畅的工具链。如果使用的是 Windows 系统则不需要阅读此文&#xff0c;因为 win32com 库更方便。这篇文章中 Excel 转 HTML 的方案&#xff0c;主要弥补…

ZooKeeper Watcher 机制详解:从注册到回调的全过程

引言 在分布式系统中&#xff0c;数据的实时性和一致性是至关重要的。ZooKeeper 通过其 Watcher 机制提供了一种高效的方式来监听数据变化或事件&#xff0c;从而使客户端能够在数据发生变化时立即收到通知。本文将深入探讨 ZooKeeper 的 Watcher 机制&#xff0c;具体包括客户…

继承QLineEdit类实现自动补全功能

QlineEdit类本身是没有自动补全功能的&#xff0c;可以使用QCompleter配合实现功能。 但是在开发过程中发现&#xff0c;输入的字符串如果匹配那么QCompleter类会弹窗显示匹配项&#xff0c;如果输入的字符串不匹配则QCompleter类会关闭弹出(这点我也倒是能理解&#xff0c;没有…

从量化投资到AI大模型:DeepSeek创始人梁文锋的创新之路

一、学术的启蒙:学霸的崭露头角 梁文锋的成长故事始于1985年,他出生在广东省湛江市的一个普通家庭。从小,梁文锋就展现出对知识的强烈渴望和非凡的学习能力,尤其在数学领域,他总是能够轻松解决复杂的难题,成为学校里备受瞩目的“学霸”。 2002年,年仅17岁的梁文锋以吴川…

【课程设计参考】迷宫小游戏 :基于 Python+Pygame+AI算法

一、内容 实现走迷宫 &#xff08;1&#xff09;游戏界面显示&#xff1a;迷宫地图、上下左右移动的特效。 &#xff08;2&#xff09;动作选择&#xff1a;上下左右键对应于上下左右的移动功能&#xff0c;遇到障碍的处理。 &#xff08;3&#xff09;得分统计功能&#xff…

redis高级数据结构Stream

文章目录 背景stream概述消息 ID消息内容常见操作独立消费创建消费组消费 Stream弊端Stream 消息太多怎么办?消息如果忘记 ACK 会怎样?PEL 如何避免消息丢失?分区 Partition Stream 的高可用总结 背景 为了解决list作为消息队列是无法支持消息多播问题&#xff0c;Redis5.0…

在stm32mp257的yocto中设置用户名和密码

在STM32MP257的Yocto环境中设置用户名和密码,通常需要修改根文件系统的用户配置。以下是详细步骤: 1. 设置root密码 默认情况下,root账户可能无密码或使用默认密码。通过以下方法修改: 方法1:在local.conf中直接设置 # 打开Yocto工程的配置文件 vi conf/local.conf# 添…

4.3 注入sidecar的mutatePod注入函数编写

本节重点总结 : serveMutate编写 准入控制请求参数校验根据annotation标签判断是否需要注入sidecarmutatePod 注入函数编写生成注入容器和volume的patch函数 serveMutate编写 普通校验请求 serveMutate方法body是否为空req header的Content-Type 是否为application/json v…

win10向windows server服务器传输文件

win10向windows server服务器传输文件 遇到无法直接拖动文件进行传输时 解决方案&#xff1a; 1.点击显示选项 2.点击本地资源-详细信息 3.在窗口中选择你需要共享的磁盘 4.然后远程连接到Windows server服务器 5.登录Windows server服务器后&#xff0c;在此电脑下就能看…

为AI聊天工具添加一个知识系统 之93 详细设计之34 Derivation 之 8 实现和平台

本文要点 要点 插入话题&#xff1a;实现 “实现”作为一个普通名词&#xff08;一般术语&#xff09;应该遵循第一性第二性第三性原则。其 第一性第二性第三性 分别是&#xff1a;完整性/鲁棒性/健壮性 &#xff0c;三者 分别注重 性能/功能/能力。即 首先是 实现完整性的性…

ASP.NET Core SignalR的协议协商

SignalR支持多种服务器推送方式&#xff1a;Websocket、Server-Sent Events、长轮询。默认按顺序尝试。F12查看协商过程。websocket和HTTP是不同的协议&#xff0c;为什么能用同一个端口。在【开发人员工具】的【网络】页签中看WebSocket通信过程。 协议协商问题 集群中协议协…