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

仿muduo库实现高并发服务器----EventLoop与线程整合起来

目录

一、目的

二、含义

三、功能

四、成员变量

五、成员函数

六、Loopthread

1、目的

2、功能

3、成员变量

4、成员函数


一、目的

EventLoop模块与线程是一一对应的

EventLoop实例化的对象在构造的时候就会初始化_thread_id

而后边当运行一个操作的时候判断当前是否运行在eventloop模板对应的线程中,就是将线程ID与EventLoop模板中的thread_id进行一个比较,相同就表示在同一个线程,不同就表示当前运行线程并不是EventLoop线程

二、含义

EventLoop模板在实例化对象的时候必须在线程内部,EventLoop实例化对象时会设置自己的thread_id,如果我们先创建多个EventLoop对象,然后创建了多个线程,将各个线程的id,重新给Event Loop进行设置 存在问题,在构造EventLoop对象,到设置新的thread_id期间将是不可控的,因此我们必须先创建线程,然后再线程的入口函数中,去实例化EventLoop对象

所以我们构造一个新模块:LoopThread

三、功能

将EventLoop与thread整合到一起

思想:
1、创建线程

2、在线程中实例化EventLoop对象(可以向外部返回实例化的EventLoop)

四、成员变量

条件变量(用于实现_loop获取的同步关系避免线程创建,但是_loop还没有去实例化之前获取_loop*)

互斥锁

线程id

EventLoop指针变量,这个对象需要在线程内部实例化

五、成员函数

构造

创建线程,设定线程入口地址

线程入口地址

获取Loop指针

如果loop为NULL就一直阻塞

六、Loopthread

1、目的

对所有的LoopThread进行管理及分配

2、功能

1、线程数量课配置

注意事项:在服务器中,主从Reactor模型是主线程只负责新连接的获取,从属线程负责链接的事件监控及处理

因此当前的线程池有可能从属线程会数量为0,也就是实现单Reactor服务器,一个线程负责获取链接,也负责链接的处理

2、对所有的线程进行管理,其实就是管理0个或多个LoopThread对象

3、提供线程分配的功能

当主线程获取一个新连接,需要将新连接挂到从属线程上进行事件监控及处理

假设有0个从属线程,则直接分配给主线程的EventLoop进行处理,假设有多个从属线程则采用RR轮思想,进行线程的分配(将对应线程的EventLoop获取到,设置给对应的Connection)

3、成员变量

从属线程的数量

保存所有的LoopThreadPool

EventLoop运行在主线程从属线程数量为0,所有的操作都在baseLoop中进行

从属线程数量大于0则从_loops中进行EventLoop分配

下一个线程id

4、成员函数

构造

设置线程的数量

创建所有从属线程

下一个线程

class LoopThread { private: std::mutex _mutex; std::condition_variable _cond; std::thread _thread; EventLoop *_loop; void ThreadEntry() { EventLoop loop; { std::unique_lock<std::mutex> lock(_mutex); _loop = &loop; _cond.notify_all(); } loop.Start(); } public: LoopThread() : _loop(NULL), _thread(std::thread(&LoopThread::ThreadEntry, this)) { } EventLoop *GetLoop() { EventLoop *loop = NULL; { std::unique_lock<std::mutex> lock(_mutex); _cond.wait(lock, [&]() { return _loop != NULL; }); loop = _loop; } return loop; } }; class LoopThreadPool { private: int _thread_cout; std::vector<LoopThread *> _threads; EventLoop *_baseloop; std::vector<EventLoop *> _loops; int _next_loop_idx; public: LoopThreadPool(EventLoop *baseloop) : _thread_cout(0), _next_loop_idx(0), _baseloop(baseloop) { } void SetThreadCount(int cout) { _thread_cout = cout; } void Creat() { if (_thread_cout > 0) { _threads.resize(_thread_cout); _loops.resize(_thread_cout); for (int i = 0; i < _thread_cout; i++) { _threads[i] = new LoopThread(); _loops[i] = _threads[i]->GetLoop(); } return; } } EventLoop *NextLoop() { if (_thread_cout == 0) return _baseloop; _next_loop_idx = (_next_loop_idx + 1) % _thread_cout; return _loops[_next_loop_idx]; } };

http://www.jsqmd.com/news/488150/

相关文章:

  • 避坑指南:Vite打包Web Worker时遇到的5个常见问题及解决方案
  • Ostrakon-VL-8B构建自动化测试系统:智能验证GUI界面与设计稿一致性
  • Java四大排序算法精解
  • 基于 HTML/CSS 的毕业设计:从静态页面到工程化实践的深度指南
  • GPU核心揭秘:从渲染到AI计算
  • 为什么你的VSCode 2026插件响应延迟超840ms?——基于17万行真实日志的性能归因分析(含可复现火焰图)
  • Youtu-VL-4B-Instruct多模态推理:化学分子式图像识别+反应路径推理案例
  • AudioLDM-S提示词魔法:10个英文短语,快速生成高质量环境音效
  • ArcGIS Server添加主机500错误终极解决指南
  • LingBot-Depth在VSCode中的开发插件:提升3D编程效率
  • 告别复杂配置:Anything V5 Stable Diffusion 极简部署与快速调用教程
  • Golang指针的基本概念
  • WGS84与笛卡尔坐标转换实战:从数学原理到C++/Matlab高效实现
  • 机器学习、数据科学、深度学习、神经网络的区别与联系
  • ChatTTS 最新版本下载与快速入门指南:从安装到实战避坑
  • PyCharm2025.2 大更新,AI是亮点!
  • 为什么你的MCP插件总在调试时崩溃?揭秘VS Code Extension Host内存泄漏链(附自动检测脚本)
  • TradingAgents-CN智能交易系统:从基础到进阶的全方位应用指南
  • 新手避坑指南:Vue3+Router跳转同页面不更新的3个修复技巧
  • AI Agent 设计模式:从理论到实践的完整指南
  • Photoshop工具消失?3步快速恢复
  • 基于深度学习的非机动车头盔检测(YOLOv12/v11/v8/v5模型+数据集)(源码+lw+部署文档+讲解等)
  • 5 种使用 Python 自动化处理 PDF 的实用方法
  • GitHub 官宣 GitHub Copilot CLI 开发公测:AI CLI 大战
  • TCN实战:用Python和Keras搞定时序数据分类(附MNIST代码)
  • 5步搞定LingBot部署:AI初创公司快速搭建深度感知演示系统
  • Jimeng AI Studio Z-Image Turbo部署教程:Kubernetes集群弹性扩缩容
  • Qwen3-ASR-1.7B镜像免配置优势:无需ffmpeg编译,原生支持mp3解码
  • Comfy UI输入节点设计全解析
  • 【图文对话实战】Phi-3-vision-128k-instruct模型:快速搭建你的AI视觉助手