【C++】线程池

一、线程池的概念

线程池是一种管理线程使用的模式,尽管线程数量过多可能会增加调度成本,从而影响缓存的局部性和整体性能。线程池通过维护多个线程,准备好分配并行执行的任务,避免了短时任务处理中线程的创建和销毁成本。线程池不仅确保了内核资源的充分使用,还避免了过度调度。合理的线程数量应根据可用的并行处理器、处理器核心、内存和网络套接字等资源来确定。

二、线程池的应用场景

1. 完成任务需要大量线程,且任务完成时间较短。对于WEB服务器来说,完成如网页请求这类任务,采用线程池技术非常适宜。因为虽然单个任务体量小,但任务数量庞大,可以类比一个热门网站的点击率。然而,对于耗时较长的任务,例如Telnet连接请求,线程池的优势就不那么明显了,因为Telnet会话的持续时间远超过线程创建时间。

2. 对于对性能要求极高的应用,例如需要服务器快速响应客户端请求的情况。

3. 能够处理突发的大量请求,但不会因此而导致服务器生成大量线程的应用。在没有线程池的情况下,突发的大量客户请求可能会生成大量线程,尽管大多数操作系统理论上的线程数上限并不构成问题,但短时间内的大量线程生成可能会使内存达到极限,从而出现错误。

线程池的简单流程:

1. 创建固定数量线程池,循环从任务队列中获取任务对象

2. 获取到任务对象后,执行任务对象中的任务接口

三、线程池的简单实现

#pragma once#include<iostream>
#include <vector>
#include <string>
#include <queue>
#include <pthread.h>
#include <unistd.h>
#include "Task.hpp"struct threadinfo
{pthread_t tid;std::string name;
};template<class T>
class threadpool
{
public:void Lock(){pthread_mutex_lock(&_mutex);}void Unlock(){pthread_mutex_unlock(&_mutex);}void Thread_wakeup(){pthread_cond_signal(&_cond);}void Thread_sleep(){pthread_cond_wait(&_cond, &_mutex);}bool IsQueueEmpty(){return _tasks.empty();}std::string GetThreadName(pthread_t tid){for (const auto &ti : _threads){if (ti.tid == tid)return ti.name;}return "None";}
public:static void *handle(void *args){threadpool<T> *tp = static_cast<threadpool<T> *>(args);std::string name = tp->GetThreadName(pthread_self());while(true){tp->Lock();while(tp->IsQueueEmpty()){tp->Thread_sleep();}T temp = tp->Pop();tp->Unlock();temp();std::cout << name << " run, " << "result: " << temp.GetResult() << std::endl;}}void launch(){int n = _threads.size();for(int i = 0; i < n; i++){_threads[i].name = "thread-" + std::to_string(i + 1);pthread_create(&(_threads[i].tid), nullptr, handle, this);}}T Pop(){T t = _tasks.front();_tasks.pop();return t;}void Push(const T &t){Lock();_tasks.push(t);Thread_wakeup();Unlock();}threadpool(int n = 5):_threads(n){pthread_mutex_init(&_mutex, nullptr);pthread_cond_init(&_cond, nullptr);}~threadpool(){pthread_mutex_destroy(&_mutex);pthread_cond_destroy(&_cond);}private:std::vector<threadinfo> _threads;std::queue<Task> _tasks;pthread_mutex_t _mutex;pthread_cond_t _cond;};

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

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

相关文章

导出QQ好友列表、群列表、群员列表

MENU 准备工作在浏览器地址栏中输入地址使用F12快捷键打开开发者工具(浏览器控制台)点击头像登入网站(推荐)或手机扫码登录获取群列表获取好友列表获取群员列表 准备工作 一台带有浏览器的电脑 在浏览器地址栏中输入地址 https://qun.qq.com/member.html 使用F12快捷键打开开发…

洪水仿真模拟(ArcGIS),水利数字孪生新利器

这两天ArcGIS Pro的官方账号释放了一个名为“Flood Simulation in ArcGIS Pro”的洪水模拟功能视频。根据视频详情页的介绍&#xff0c;该洪水仿真模拟功能会作为新功能出现在ArcGIS Pro 3.3中。 由于我目前从事的主要应用方向都是弱GIS的领域&#xff0c;所以我已经很久没有再…

Panasonic机器人维修|松下机械手维修过程

在我们的科技日新月异的今天&#xff0c;松下机器人已经广泛应用于各个领域&#xff0c;发挥着越来越重要的作用。然而&#xff0c;这些Panasonic机械手维修过程也是一项重要且复杂的工作。 一、准备工作 在进行松下机器人维修前&#xff0c;需要充分了解机器人的构造和工作原理…

头歌实践教学平台:CG1-v1.0-点和直线的绘制

第1关&#xff1a;OpenGL点的绘制 一. 任务描述 根据下面要求&#xff0c;在右侧修改代码&#xff0c;绘制出预期输出的图片。平台会对你编写的代码进行测试。 1.本关任务 熟悉编程环境&#xff1b; 了解光栅图形显示器的特点&#xff1b; 了解计算机绘图的特点&#xff1b…

自动化运维管理工具----------Ansible模块详细解读

目录 一、自动化运维工具有哪些&#xff1f; 1.1Chef 1.2puppet 1.3Saltstack 二、Ansible介绍 2.1Ansible简介 2.2Ansible特点 2.3Ansible工作原理及流程 2.3.1内部流程 2.3.2外部流程 三、Ansible部署 3.1环境准备 3.2管理端安装 ansible 3.3Ansible相关文件 …

图片转pdf的java代码实现

一、实现方式 采用itextpdf和itext包&#xff0c;使用java代码&#xff0c;把图片转换为pdf. 支持文件格式&#xff1a;png&#xff0c;jpg, jpeg,gif 二、java代码实现 1、maven依赖 <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependen…

反了!美国假冒邮政服务钓鱼网站访问量竟然超过正规官网

美国邮政是美国主要的包裹信件投递机构之一&#xff0c;长期以来该单位都是网络钓鱼和诈骗的针对目标。对美国公民来说&#xff0c;在假期通常都会收到声称来自美国邮政的诈骗。美国邮政甚至单独建设的网页提醒消费者警惕诈骗信息&#xff1a; 专用提醒网页 Akamai 的研究人员…

Redis是单线程吗?为什么6.0之后引入了多线程?

Redis是单线程吗&#xff1f;为什么6.0之后引入了多线程&#xff1f; Redis 是单线程吗&#xff1f;Redis 单线程模式是怎样的&#xff1f;Redis 采用单线程为什么还这么快&#xff1f;Redis 6.0 之前为什么使用单线程&#xff1f;Redis 6.0 之后为什么引入了多线程&#xff1f…

在拥有多个同名称密码的ap环境中,如何连接到指定信道或mac的ap路由器?

在给客户做ESP32-C3入墙开关项目时&#xff0c;客户问&#xff1a;在拥有多个同名称密码的ap环境中&#xff0c;如何连接到指定信道或mac的ap路由器&#xff1f;针对这个问题&#xff0c;启明云端工程师给出下面解决方法。 1、将wifi_sta_config_t配置中的channel配置为该信道…

视频拼接融合产品的产品与架构设计(二)

视频拼接融合产品的产品与架构设计一 以上是第一期&#xff0c;以前思考的时候还是比较着急&#xff0c;现在思考的更多了&#xff0c;现实世界的拼接更加需要我们沉下心来做&#xff0c;尤其是对于更多画面&#xff0c;画面更加清晰怎么做 本篇章不在于其他功能&#xff0c;在…

认识下MapReduce

&#x1f50d; 什么是MapReduce&#xff1f; MapReduce是一种分布式计算模型&#xff0c;最初由Google提出&#xff0c;用于处理大规模数据集的并行计算。它将数据处理任务分解成独立的Map和Reduce两个阶段&#xff0c;以实现分布式计算和并行化处理。Map阶段负责将输入数据映…

微信畅销榜,就这款游戏玩进去了!太无厘头了

周三的文章《不可要放过&#xff0c;微信畅玩榜啊&#xff01;我发现暗藏的几个惊天大秘》&#xff0c;晓衡扒拉一下微信小游戏畅玩榜上的游戏&#xff0c;就下面这张图&#xff1a; 有老铁不服&#xff0c;说畅玩榜大部分都是休闲小游戏&#xff0c;问我还有没有 Cocos 做的更…

NAND Flash 与 NOR Flash间的区别

非易失性存储器是一种即使未通电也能保持其内容的存储器。非易失性存储器可以有不同的形式: ROM – 只读存储器&#xff0c;数据写入一次&#xff0c;允许多次读取访问。 PROM – 可编程只读存储器&#xff0c;数据写入一次&#xff08;不是在制造过程中&#xff0c;而是以后的…

bat 设置临时环境变量

echo off set TEMP_PATHC:\your\temp\path set PATH%TEMP_PATH%;%PATH%注意事项&#xff1a; TEMP_PATHC:\your\temp\path 赋值语句****的左右两边不能有空格&#xff08;空格通常被视为分隔符&#xff0c;用于将命令和参数分开&#xff09;

webjars学习

webjars介绍 官网&#xff1a;WebJars - Web Libraries in Jars github: WebJars GitHub 文档&#xff1a;WebJars - Documentation WebJAR 是一个用于管理Web前端依赖的工具。它允许开发者将特定的客户端库&#xff08;如JavaScript、CSS等&#xff09;打包成JAR&#xf…

PHP基于vscode医院安全不良事件管理系统源码(AEMS)前端vue2+element+后端laravel8不良事件上报与闭环管理

PHP基于vscode医院安全不良事件管理系统源码&#xff08;AEMS&#xff09;前端vue2element后端laravel8不良事件上报与闭环管理 医院不良事件上报与管理系统结合现代医院管理思路&#xff0c;遵照PDCA全面质量循环管理方法而设计&#xff0c;并在多家大型三甲医院成熟运用。系统…

C# 排序的多种实现方式

排序是我们编程时的常用操作&#xff0c;实现方式也有很多种&#xff0c;本篇文章列举几种我常用的用法&#xff0c;希望对大家有用&#xff01; 01 数组排序 最常见的排序是对一个数组排序&#xff0c;比如&#xff1a; int[] aArray new int[8] { 18, 17, 21, 23, 11, 31…

设置 kafka offset 消费者位移

文章目录 1.重设kafka消费者位移2.示例2.1 通过 offset 位置2.2 通过时间2.3 设置到最早 1.重设kafka消费者位移 维度策略含义位移Earliest把位移调整到当前最早位移处位移Latest把位移调整到当前最新位移处位移Current把位移调整到当前最新提交位移处位移Specified-Offset把位…

JVM-01

JVM&#xff08;Java虚拟机&#xff09;是Java平台的核心组件之一&#xff0c;它是一个虚拟计算机&#xff0c;可以执行Java字节码文件。JVM解释并执行Java字节码&#xff0c;并提供了其他功能&#xff0c;如内存管理和垃圾回收。 JVM的基本功能包括以下几个方面&#xff1a; …

Spring Cloud Alibaba 网关 Gateway 集成(7)

项目的源码地址 Spring Cloud Alibaba 工程搭建&#xff08;1&#xff09; Spring Cloud Alibaba 工程搭建连接数据库&#xff08;2&#xff09; Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用&#xff08;3&#xff09; Spring Cloud Alibaba Ribbo…