C/C++精品项目之图床共享云存储(8):将项目最后变成多线程

目录

一:初始化线程池

二:多线程的业务处理


C/C++精品项目之图床共享云存储(1):基础组件-CSDN博客

C/C++精品项目之图床共享云存储(2):MySql连接池_mysql 连接池c++ ping-CSDN博客

C/C++精品项目之图床共享云存储(3):网络缓冲区类和main-CSDN博客

C/C++精品项目之图床共享云存储(4):注册,登录,token,排序文件-CSDN博客

C/C++精品项目之图床共享云存储(5):FastDFS存储原理,文件的秒传-CSDN博客

C/C++精品项目之图床共享云存储(6):图片的共享,浏览,获取,以及短链的生成-CSDN博客

C/C++精品项目之图床共享云存储(7):图片分享和浏览的优化,共享文件的排行榜-CSDN博客

一:初始化线程池

Linux下C++线程池的实现(分模块讲解)_linux c++实现线程池-CSDN博客

Linux下c语言的线程池(分模块讲解)_linux c线程池的作用-CSDN博客

上面是我讲过的两个线程池模型,今天使用的就是这个C++的模型,是可以直接拿来使用的。我们之前写的所有业务,全都是单线程的状态,现在我们加入线程池,变成多线程模式。

首先我们在主线程中,初始化线程池:我们使用init和start初始化了线程池,在线程池中,我们含有两个列表,一个是定时器列表,一个是loop事件列表。我们加入的这个回调函数就是放在了loop列表中,这个函数我会放在另外一个代码块中。

void http_loop_callback(void *callback_data, uint8_t msg, uint32_t handle,void *pParam) {UNUSED(callback_data);UNUSED(msg);UNUSED(handle);UNUSED(pParam);CHttpConn::SendResponseDataList(); // 静态函数, 将要发送的数据循环发给客户端//也就是在多线程中,将这些多个任务完成后的结果,按着id发送回去,为什么说是循环发送呢?,因为我们加入loop后,没有进行删除,所以一直存在。
}int initHttpConn(uint32_t thread_num) {g_thread_pool.Init(thread_num); // 初始化线程数量g_thread_pool.Start();          // 启动多线程,创建多线程netlib_add_loop(http_loop_callback,NULL); // http_loop_callback被epoll所在线程循环调用return 0;
}

首先我们回顾一下线程池和socket的一些东西,我们整体的运行是怎么样的:我们网络就是服务端进行listen,accept等待,然后进入到事件循环中进行epoll_wait,当客户端连接上来,触发读事件,执行了传入来的回调函数,并且重新设置了socket的回调函数(变成了http的回调函数了),接下来就是业务相关的处理,比如这里的登录,我们现在是多线程的,我们进行多个登录,当登录成功后,我们把这个登录信息,封装起来,放入一个链表中,也就是上面的:SendResponseDataList。这个函数是处理链表中的信息的,将他们的信息依次返回。

二:多线程的业务处理

我们不是开启多线程了吗,我们主线程主要是接收客户端的连接,分发任务到线程池中,然后线程池处理完任务后,将要返回的信息放到链表中,然后主线程将这些信息发送回去。也就是说线程池不处理发送消息的IO。

typedef struct {uint32_t conn_uuid; // 用于查找connectionstring resp_data;   // 要回发的数据
} ResponsePdu_t;static HttpConnMap_t g_http_conn_map;
std::mutex CHttpConn::s_resp_mutex;
std::list<ResponsePdu_t *> CHttpConn::s_response_pdu_list;//主线程用来发送消息的链表
void CHttpConn::SendResponseDataList() {// LogInfo("into");// 发送数据s_resp_mutex.lock();while (!s_response_pdu_list.empty()) {ResponsePdu_t *pResp = s_response_pdu_list.front();s_response_pdu_list.pop_front();s_resp_mutex.unlock();CHttpConn *pConn = FindHttpConnByHandle(pResp->conn_uuid); // 该连接有可能已经被释放,如果被释放则返回NULLLogInfo("conn_uuid: {}", pResp->conn_uuid); //{0:x}if (pConn) {// LogInfo("send: {}", pResp->resp_data);pConn->Send((void *)pResp->resp_data.c_str(),pResp->resp_data.size());  // 最终socket send}delete pResp;s_resp_mutex.lock();}s_resp_mutex.unlock();
}//客户端用来给这个链表添加信息的
void CHttpConn::AddResponseData(uint32_t conn_uuid, string &resp_data) {LogInfo("into");ResponsePdu_t *pResp = new ResponsePdu_t;pResp->conn_uuid = conn_uuid;pResp->resp_data = std::move(resp_data);s_resp_mutex.lock();s_response_pdu_list.push_back(pResp);s_resp_mutex.unlock();
}

        接下来我们看看具体的多线程业务:我们看到多线程中,并未直接封装后返回,而是将封装的json放入到了链表中,当我们这个事件触发完成后,就会将这个进行返回。

//多线程处理 
void CHttpConn::_HandleLoginMRequest(string &url, string &post_data) {g_thread_pool.Exec(ApiUserLoginM, conn_handle_, post_data);
}//多线程处理
int ApiUserLoginM(u_int32_t conn_uuid, string &post_data) {string user_name;string pwd;string token;string resp_json;// 判断数据是否为空if (post_data.empty()) {encodeLoginJson(1, token, resp_json);goto END;}// 解析jsonif (decodeLoginJson(post_data, user_name, pwd) < 0) {LogError("decodeRegisterJson failed");encodeLoginJson(1, token, resp_json);goto END;}// 验证账号和密码是否匹配if (verifyUserPassword(user_name, pwd) < 0) {LogError("verifyUserPassword failed");encodeLoginJson(1, token, resp_json);goto END;}// 生成token并存储在redisif (setToken(user_name, token) < 0) {LogError("setToken failed");encodeLoginJson(1, token, resp_json);goto END;} else {encodeLoginJson(0, token, resp_json);goto END;}
END:char *str_content = new char[HTTP_RESPONSE_HTML_MAX];uint32_t ulen = resp_json.length();snprintf(str_content, HTTP_RESPONSE_HTML_MAX, HTTP_RESPONSE_HTML, ulen,resp_json.c_str());resp_json = str_content;CHttpConn::AddResponseData(conn_uuid, resp_json);delete str_content;return 0;
}//单线程处理
int ApiUserLogin(string &post_data, string &resp_json) {string user_name;string pwd;string token;// 判断数据是否为空if (post_data.empty()) {return -1;}// 解析jsonif (decodeLoginJson(post_data, user_name, pwd) < 0) {LogError("decodeRegisterJson failed");encodeLoginJson(1, token, resp_json);return -1;}// 验证账号和密码是否匹配if (verifyUserPassword(user_name, pwd) < 0) {LogError("verifyUserPassword failed");encodeLoginJson(1, token, resp_json);return -1;}// 生成token并存储在redisif (setToken(user_name, token) < 0) {LogError("setToken failed");encodeLoginJson(1, token, resp_json);return -1;} else {encodeLoginJson(0, token, resp_json);return 0;}
}

对于其他的一些业务,有些可以使用多线程,有些则不可以,我只是拿出了一个例子,其他的业务操作也是一样的。0voice · GitHub

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

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

相关文章

解决upload上传之后,再上传没有效果

解决upload上传之后&#xff0c;再上传没有效果 注释&#xff1a;这是第二次上传&#xff0c;两次网络请求都是第一次上传的&#xff0c;这次上传没有网络请求 原因&#xff1a;在我的代码里我限制了上传数量为1&#xff0c;然后上传成功后&#xff0c;上传列表没有清空&#…

【Linux】<共享内存应用>——模拟实现不同进程把hello字符对<共享内存文件对象>的放入和取出操作

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号 Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-单端信号详细介绍了单端信号如何进行TDR仿真分析,下面介绍如何对差分信号进行TDR分析,还是以下图为例进行分…

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…

golang调用webview,webview2,go-webview2

go version go1.20 windows/amd64 先要了解一些第三方库 1、webview/webview 它是一个跨平台的轻量级的webview库&#xff0c;面向的是C/C&#xff0c;使用它可以构建跨平台的GUI。webview就是浏览器内核&#xff0c;在不同操作系统上是不同的库&#xff0c;比如在windows上…

SpringBoot与MongoDB深度整合及应用案例

SpringBoot与MongoDB深度整合及应用案例 在当今快速发展的软件开发领域&#xff0c;NoSQL数据库因其灵活性和可扩展性而变得越来越流行。MongoDB&#xff0c;作为一款领先的NoSQL数据库&#xff0c;以其文档导向的存储模型和强大的查询能力脱颖而出。本文将为您提供一个全方位…

【工控】线扫相机小结 第四篇

背景 这一片主要是对第三篇继续补充。话说上一篇讲到了两种模式的切换&#xff0c;上一篇还遗留了一个Bug&#xff0c;在这一篇里进行订正&#xff01; 代码回顾 /// <summary>/// 其实就是打开触发/// </summary>void SetLineSacanWorkMode(){-----首先设置为帧…

ThingsBoard规则链节点:AWS SNS 节点详解

目录 引言 1. AWS SNS 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 设备报警 3.2 数据同步 3.3 用户通知 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备管理、…

VMAuthdService服务启动不了~

问题原因&#xff0c;我的VMware Workstation Pro安装在了硬盘上&#xff0c;原先硬盘分配的磁盘是F盘&#xff0c;但是我现在插入电脑显示的是E盘。路径冲突了&#xff0c;所以找不到服务。我更改一下硬盘的磁盘名称就好使啦~ 怎么修改磁盘名称&#xff0c;我想把F盘改成E盘-…

小程序25- iconfont 字体图标的使用

项目中使用到图标&#xff0c;一般由公司设计进行设计&#xff0c;设计好后上传到阿里巴巴矢量图标库 日常开发过程中&#xff0c;也可以通过 iconfont 图标库下载使用自带的图标 补充&#xff1a;使用 iconfont 图标库报错&#xff1a;Failed to load font 操作步骤&#xff…

【操作系统】操作系统的特征

操作系统的七个基本特征 并发性&#xff08;Concurrence&#xff09; 并发性是指操作系统在同一时间间隔内执行和调度多个程序的能力&#xff0c;提高资源利用率和系统效率。尽管多个任务可能在同一时刻看似同时进行&#xff0c;但实际上&#xff0c;CPU在多个任务之间快速切…

C# 数据结构之【树】C#树

以二叉树为例进行演示。二叉树每个节点最多有两个子节点。 1. 新建二叉树节点模型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace DataStructure {class TreeNode{public int Data { get;…

2024年中国无人机产业研究报告(附产业链图谱)

无人机是指以空气动力为升力来源、无人员搭载的空中飞行器&#xff0c;简称UAV。最初为军事应用而开发&#xff0c;后来被应用于个人消费、地理测绘、影视航拍等越来越多的领域&#xff0c;并在应急救援、通信中继、气象探测等新场景中发挥着重要作用。 近年来&#xff0c;国家…

深入理解Spring(二)

2、Spring应用 2.1、基于xml的Spring应用 2.1.1、SpringBean的配置详解 Spring开发中主要是对Bean的配置,Bean的常用配置一览如下: 1)Bean的基础配置 例如:配置UserDaoImpl由Spring容器负责管理 此时存储到Spring容器(singleObjects单例池)中的Bean的beanName是user…

趋势洞察|AI 能否带动裸金属 K8s 强势崛起?

随着容器技术的不断成熟&#xff0c;不少企业在开展私有化容器平台建设时&#xff0c;首要考虑的问题就是容器的部署环境——是采用虚拟机还是物理机运行容器&#xff1f;在往期“虚拟化 vs. 裸金属*”系列文章中&#xff0c;我们分别对比了容器部署在虚拟化平台和物理机上的架…

Python Matplotlib 数据可视化全面解析:选择它的七大理由与入门简介

Python Matplotlib数据可视化全面解析&#xff1a;选择它的七大理由与入门简介 本文介绍了Matplotlib这一强大而灵活的数据可视化工具&#xff0c;涵盖其基本概念、独特优势以及为何在众多Python绘图库中脱颖而出。Matplotlib具有广泛的社区支持、高度自定义能力、多样的绘图类…

【C++】深入解析 C++ 多态机制:虚函数、动态绑定与抽象类的精髓

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 &#x1f4cc; 前言&#x1f4cc;1 多态✨ 1.1 多态的概念 &#x1f4cc; …

【反向迭代器】—— 我与C++的不解之缘(十七)

前言 ​ 在STL中的迭代器部分&#xff0c;之前只关注与正向迭代器&#xff0c;忽视了反向迭代器&#xff1b;现在来看一下反向迭代器到底是个什么东西&#xff0c;以及反向迭代器怎么实现&#xff0c;怎么为之前自己模拟实现的容器增加反向迭代器&#xff1f; 反向迭代器的使用…

无人机与低空经济:开启新质生产力的新时代

无人机技术作为低空经济的核心技术之一&#xff0c;正以其独特的优势在多个行业中发挥着重要作用&#xff0c;成为推动新质生产力革命的重要力量。无人机的应用范围广泛&#xff0c;从农业植保到物流配送&#xff0c;从城市监测到紧急救援&#xff0c;无人机的身影无处不在&…

ElasticSearch7.x入门教程之中文分词器 IK(二)

文章目录 前言一、内置分词器二、中文IK分词器&#xff08;第三方&#xff09;三、本地自定义四、远程词库总结 前言 ElasticSearch 核心功能就是数据检索&#xff0c;首先通过索引将文档写入 es。 查询分析则主要分为两个步骤&#xff1a; 1、词条化&#xff1a;分词器将输入…