EventLoopThreadPool模块---从属Reactor线程池

目录

模块设计

模块实现


模块设计

一个EventLoopThread模块是一个从属EventLoop线程,而我们的主从Reactor模型可能会存在多个从属Reactor线程,那么为了便于管理,我们可以将其封装成一个线程池,便于我们管理或者一次性启动这些从属的Reactor线程。

那么这个模块内需要哪些成员呢? 首先需要保存多个EventLoopThread对象,所以需要一个vector来保存这些对象,其次还需要一个变量用来保存从属线程数量。同时,未来我们的TcpServer需要获取到从属线程的EventLoop*指针,而我们也直到,要从EventLoopThread中获取这个指针需要加锁,如果每一次获取的时候都加锁获取,那么效率不够高,所以我们可以直接使用一个vector将所有的从属线程的EventLoop的指针直接保存起来。TcpServer只负责EventLoopThreadPool中获取一个指针分配给新连接,不会关心负载均衡的问题,所以在EventLoopThreadPool中我们需要完成负载均衡的工作,最简单的就是使用一个变量作为下一次返回的EventLoop在vector中的下标,每次获取之后都进行++,那么就相当于使用轮转的方式保证了负载均衡。

同时,还是那个问题,从属Reactor线程的数量有可能为 0 ,这时候退化为了单Reactor模型,也就是一个Reactor线程处理所有的操作,那么这时候也需要一个主Reactor线程对应的EventLoop对象,所以我们还需要一个主Reactor线程的指针。这个主Reactor其实就是我们的主线程。

class EventLoopThreadPool //Reactor模型线程池
{
private:size_t _thread_cnt;                 //从属Reactor线程数量EventLoop* _base_loop;              //主Reactor线程的EventLoopstd::vector<EventLoopThread*> _pool; //从属线程池 , 这里不要直接适用对象,而是存储线程对象的指针更好,因为EventLoopThread不支持拷贝构造std::vector<EventLoop*> _loops;     //从属Reactor线程的EventLoop对象集合uint64_t _loops_idx;    //下一次分配的EventLoop*的下标

这里注意的一个细节就是,我们存储的线程对象,并不是存储对象本身,而是存储他的指针,未来在开始创建线程的时候才会真正创建对象。 因为存储对象本身的话,未来在resize的时候,时会有问题的,EventLoopThread中的成员都是不可拷贝的。

那么他需要提供哪些接口呢?

首先,需要提供接口用于设置从属线程数量

其次,需要提供接口启动线程池

还需要一个接口用于分配EventLoop,也就是返回一个EventLoop*给TcpServer用于给新连接绑定EventLoop对象。

public:EventLoopThreadPool();void SetThreadCount();  //设置从属线程数量void Start();           //启动线程池EventLoop* GetEventLoop();  //分配从属EventLoop*

模块实现

构造函数:

    EventLoopThreadPool(EventLoop* loop):_thread_cnt(0),_base_loop(loop),_loops_idx(0){}

注意这个主Reactor线程是在TcpServe创建的,后续在构造EventLoopThreadPool中传入进来作为基础的EventLoop。

设置线程数量以及启动线程也都很简单。

    void SetThreadCount(size_t cnt){_thread_cnt = cnt;}  //设置从属线程数量void Start()                        //启动线程池{_pool.resize(_thread_cnt);   _loops.resize(_thread_cnt);//获取EventLoop指针for(int i =0 ;i < _thread_cnt ; ++i){//创建对象_pool[i] = new EventLoopThread();_loops[i] = _pool[i]->GetEventLoop();    }} 

最后就是分配EventLoop对象:

    EventLoop* GetEventLoop()            //分配从属EventLoop*{if(_thread_cnt == 0) return _base_loop;return _loops[(_loops_idx++)%_thread_cnt];}

这样简单的EventLoopThreadPool就设计完了

这个模块的代码其实也不好测试,我们后续设计完整个服务器模块之后再来一起测试。

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

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

相关文章

DBeaver连接Hive教程

hive shell&#xff1a;通过hive shell来操作hive&#xff0c;但是至多只能存在一个hive shell&#xff0c;启动第二个会被阻塞&#xff0c;也就是说hive shell不支持并发操作。 基于JDBC等协议&#xff1a;启动hiveserver2&#xff0c;通过jdbc协议可以访问hive&#xff0c;hi…

基于SSM服装定制系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;服装类型管理&#xff0c;服装信息管理&#xff0c;服装定制管理&#xff0c;留言反馈&#xff0c;系统管理 前台账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xf…

git commit / push 报错 文件不存在

1. 错误信息 尝试使用 git restore --staged filename 取消暂存&#xff0c;但是报错 2. 解决方法 进入 当前仓库/.git文件夹内&#xff0c;删除 index.lock 文件 再执行 git restore --staged filename 等操作。

通过无线路由器连接三菱PLC的设置方法

1.首先设置无线路由器上网方式为DHCP&#xff08;自动获取IP地址&#xff09;。点击保存&#xff0c;然后点击更多功能 2.再点击网络设置-局域网&#xff0c;勾选DHCP服务器&#xff0c;此功能的作用是对局域网内所有设备分配IP地址。 然后保存&#xff1b; 3.再点击系统设置…

Git极速入门

git初始化 git -v git config --global user.name "" git config --global user.email "" git config --global credential.helper store git config --global --list省略(Local) 本地配置&#xff0c;只对本地仓库有效–global 全局配置&#xff0c;所有…

云计算实验1——基于VirtualBox的Ubuntu安装和配置

实验步骤 1、VirtualBox的安装 本实验使用VirtualBox-7.0.10 进行演示。对于安装包&#xff0c;大家可以前往 VirtualBox官网下载页面(https :/ / www. virtualbox.org/wiki/Downloads)下载其7.0版本安装包进行安装&#xff0c;或者直接使用QQ群的安装包VirtualBox-7.0.10-15…

给定一个正整数n随机生成n个字节即生成2n个十六进制数将其组成字符串返回secrets.token_hex(n)

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 给定一个正整数n 随机生成n个字节 即生成2n个十六进制数 将其组成字符串返回 secrets.token_hex(n) [太阳]选择题 根据题目代码&#xff0c;执行的结果错误的是&#xff1f; import secrets …

对vue响应式数据的理解(vue基础,面试,源码级讲解)

首先我们要知道哪些数据可以劫持。 是否可以劫持&#xff1a; 在JavaScript等动态语言中&#xff0c;字符串和数字虽然是基本数据类型&#xff08;也称为原始数据类型&#xff09;&#xff0c;但它们可以包装成对象&#xff08;如String对象和Number对象&#xff09;进行处理。…

软件测试笔记——接口测试

文章目录 一、概念1.接口测试流程2.URL3.HTTP协议4.RESTful5.案例介绍 二、Postman1.Postman软件2.登录接口调试-获取验证码3.登录接口调试-自动关联数据4.合同上传接口-提交请求数据5.提交参数查询6.批量执行7.接口用例设计8.断言8.参数化三、案例1.项目2.课程添加3.课程列表查…

萤石云服务支持云端视频AI自动剪辑生成

萤石视频云存储及媒体处理服务是围绕IoT设备云端存储场景下的音视频采集、媒体管理、视频剪辑和分发能力的一站式、专业云服务&#xff0c;并可面向广大开发者提供复杂设备存储场景下的完整技术方案。目前该服务新增了视频剪辑功能&#xff0c;支持将视频片段在云端进行裁剪并拼…

大数据新视界 --大数据大厂之数据脱敏技术在大数据中的应用与挑战

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

智能取暖桌:以九芯电子NRK3502语音识别芯片提升用户体验

随着科技的不断发展&#xff0c;智能家居市场日益繁荣。智能取暖桌作为其中的一款产品&#xff0c;受到了广大消费者的关注。在智能取暖桌的众多创新中&#xff0c;九芯电子NRK3502语音识别芯片的融入&#xff0c;为用户体验带来了质的飞跃。 首先&#xff0c;NRK3502语音识别芯…

#每日一题#自动化 2024年10月

#每日一题#自动化 2024年10月 1、深拷贝和浅拷贝的区别是什么&#xff1f; 参考答案&#xff1a; 深拷贝是将对象本身复制给另一个对象。这意味着如果对对象的副本进行更改时不会影响原对象。在 Python 中&#xff0c;我们使用 deepcopy&#xff08;&#xff09;函数进行深拷贝…

三种容器 std::vector、std::map、std::unordered_set 的对比分析

目录 1.添加元素 1.1 std::vector 1.2 std::map 1.3 std::unordered_set 2. 查找元素 2.1 std::vector 2.2 std::map 2.3 std::unordered_set 3. 遍历容器 3.1 std::vector 使用范围基for循环(range-based for loop) 使用迭代器: 3.2 std::map 3.3 std::unord…

一个基于vue功能强大的表格组件--vxe-table的二次封装

基础使用 一个基于 vue 的 PC 端表格组件&#xff0c;支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、虚拟列表、模态窗口、自定义模板、渲染器、贼灵活的配置项、扩展接口等… <vxe-grid v-bind"gridOptions1"…

Vue3——模板引用

绑定dom组件 defineExpose 可以用来暴露子组件的变量&#xff08;例如 ref 或 reactive&#xff09;和方法。这让父组件可以直接访问子组件的某些状态。 defineExpose 示例 以下是如何通过 defineExpose 暴露变量的示例&#xff1a; <template> <div> <bu…

基于PLC的自动涂装控制系统(开题答辩稿)

题目 基于PLC的自动涂装控制系统 (一)选题背景与依据 随着工业自动化技术的飞速发展,基于可编程逻辑控制器(PLC)的控制系统在工业生产中扮演着越来越重要的角色。特别是在涂装行业,自动化涂装系统不仅能够显著提高生产效率,还能保证产品质量的稳定性和一致性。本研究选择…

Java学习教程,从入门到精通, Java 基础语法(4)

1、Java 基础语法 一、Java 简介与开发环境搭建 Java 简介&#xff1a;Java 是一种面向对象的编程语言&#xff0c;具有跨平台、安全、稳定等特点。Java 主要应用于企业级应用、Android 应用开发、大数据处理等领域。开发环境搭建&#xff1a;搭建 Java 开发环境需要安装 JDK…

空间数据分析实验04:空间统计分析

实验概况 实验目的 了解空间统计分析的基本原理掌握空间统计分析的常用方法 实验内容 根据某村的土地利用数据和DEM数据&#xff0c;提取各村组耕地面积比例&#xff0c;并将其与村组平均坡度进行相关性分析&#xff0c;最后计算各村组单元的景观多样性指数。 实验原理与方…

鸿蒙网络编程系列30-断点续传下载文件示例

1. 断点续传简介 在文件的下载中&#xff0c;特别是大文件的下载中&#xff0c;可能会出现各种原因导致的下载暂停情况&#xff0c;如果不做特殊处理&#xff0c;下次还需要从头开始下载&#xff0c;既浪费了时间&#xff0c;又浪费了流量。不过&#xff0c;HTTP协议通过Range…