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

Reactor反应堆模式

Reactor是事件分发器基于IO 多路复用epoll/poll/select 事件回调把IO事件、读写、异常统一监听、分发到对应处理函数是高性能网络服务经典模型总结来说Reactor IO 多路复用 事件分发 回调1. 思路2. 参考代码Reactor模式实现代码3. 附加OneThreadOneLoop多进程方案One Thread One Loop OTOL是一种设计模式通常用于描述基于事件驱动编程Event Driven Programming的架构特别是在使用异步I/OAsynchronous I/O框架时。这种模式强调每个线程运行一个独立的事件循环Event Loop从而实现高效的并发处理。核心概念事件循环Event Loop事件循环是异步编程的核心负责监听事件如 I/O 操作、定时器事件等并触发相应的回调函数通常是一个单线程的执行模型通过多路复用技术如 epoll 、 select 或 poll 高效地管理多个 I/O 操作单线程模型在 One Thread One Loop 模式中每个线程运行一个独立的事件循环这种设计避免了多线程编程中的复杂同步问题同时利用了现代操作系统高效的 I/O 多路复用机制只要把单 Reactor 写完扩展多进程很容易每个进程管理的连接和 fd彼此不要重复每个 Reactor自己处理自己的 sockfd 的完整生命周期不涉及任何 IO 穿插、乱序问题多线程方案1Eventfd事件驱动如果不使用管道的话可以使用Eventfd是一个轻量级的事件通知机制基于文件描述符它可以与I/O多路复用机制如epoll 结合使用内核维护一个64位的计数器 write会增加计数器 read 会减少进程间事件通知#include stdio.h #include stdlib.h #include unistd.h #include sys/eventfd.h #include sys/wait.h int main() { // 创建一个 eventfd 文件描述符用来发事件 // EFD_CLOEXEC执行新程序时自动关闭安全规范 int efd eventfd(0, EFD_CLOEXEC); if (efd -1) { perror(eventfd); return 1; } // fork() 创建子进程 // 调用后变成两个进程父进程 子进程 pid_t pid fork(); if (pid -1) { perror(fork); return 1; } if (pid 0) { // 这里是 【子进程】 uint64_t value; // 阻塞等待读取 eventfd直到有人写入才会继续 read(efd, value, sizeof(value)); printf(Child process received event\n); close(efd); return 0; } else { // 这里是 【父进程】 uint64_t value 1; // 向 eventfd 写入 发送事件 write(efd, value, sizeof(value)); printf(Parent process sent event\n); wait(NULL); // 等待子进程结束 close(efd); return 0; } }流程创建 eventfd -- fork子进程 --子进程阻塞在 read等事件 -- 父进程 write发送事件-- 子进程收到打印提示 -- 结束线程间事件通知:#include stdio.h #include stdlib.h #include unistd.h #include sys/eventfd.h #include pthread.h // 工作线程函数 void* worker_thread(void* arg) { int efd *(int*)arg; // 获取 eventfd uint64_t value; // 阻塞等待事件 read(efd, value, sizeof(value)); printf(Worker thread received event\n); return NULL; } int main() { // 创建 eventfd int efd eventfd(0, EFD_CLOEXEC); if (efd -1) { perror(eventfd); return 1; } pthread_t thread; // 创建工作线程 pthread_create(thread, NULL, worker_thread, efd); // 主线程发送事件 uint64_t value 1; write(efd, value, sizeof(value)); printf(Main thread sent event\n); // 等待工作线程结束 pthread_join(thread, NULL); close(efd); return 0; }流程创建 eventfd -- 创建一个工作线程 --工作线程阻塞在 read等事件--主线程 write发送-- 工作线程收到打印提示 -- 结束Eventfd工作模式普通模式不设置 EFD_SEMAPHORE 读取的时候计数器会清空设置EFD_SEMAPHORE 信号量模式多线程方案2
http://www.gsyq.cn/news/1411158.html

相关文章:

  • 别再给主力机装SQL Server了!用群晖Docker搭个2019版,开发测试两不误
  • VMware Workstation Pro 17免费激活完整指南:终极许可证密钥获取与配置
  • 原来昆明这些味道好的美食店,很多人竟然都不知道?
  • JTAG调试中nSRST信号连接的必要性与实践
  • RTX51 Tiny信号量实现与UART共享应用
  • 英语作文_8B
  • 告别GUI点点点:用Ansys命令流高效搞定点线面体建模(附常用命令清单)
  • 告别第三方录屏软件!用Unity Recorder实现4K多机位动画录制(附Timeline联动技巧)
  • 2026年 欧标镀锌钢板厂家推荐排行榜:EN 10346标准宝钢、山钢集团、烨辉品牌深度解析与选购指南 - 品牌企业推荐师(官方)
  • GTA5 人物模组超详细制作流程Blender+Sollumz建模转模全细节
  • MATLAB回归分析避坑指南:regress函数实战,从数据导入到结果解读(附完整代码)
  • 构建具备主动性的AI Agent系统
  • 详解C++编程中运算符的使用
  • 基于RISC-V架构的商业航天级MCU国产化技术路径与产业生态研究
  • 【408考研·数据结构专题】二叉树、树与森林、线索树及哈夫曼树核心考点与秒杀技巧深度总结
  • LLM应用工程化:将提示词与任务流视为代码管理的实践指南
  • 别再乱调参了!用sklearn的MLPClassifier/Regressor,这3个隐藏层配置技巧让你模型效果立竿见影
  • CGA老年综合评估MMSE量表标准化应用规范
  • 别再死记硬背Sarsa公式了!用Python手搓一个‘贪吃蛇’AI,5分钟搞懂On-Policy策略
  • GEO软件代理服务商推荐:5家主流机构哪个更适合你?
  • 智赋医者,守护健康:AI技术赋能医疗行业革新与升级
  • 2026年彩涂板卷源头厂家推荐榜:宝钢/马钢/鞍钢/首钢/宝武钢铁品牌实力与品质质保书深度解析 - 品牌企业推荐师(官方)
  • 告别查表!用Excel和C语言搞定NTC103和PT100的温度换算(附完整代码)
  • 保姆级教程:在Ubuntu 22.04上通过apt和源码两种方式安装Mosquitto MQTT Broker
  • 多项土壤指标挨个测太麻烦?一台土壤多参数测定仪就能全部检测完成
  • PCIe 5.0显卡/网卡PCB设计避坑:金手指Layout里那些容易忽略的GND孔和禁布区
  • GaussDB(DWS) SQL性能问题案例集
  • R语言glmnet包避坑指南:从安装、标准化到交叉验证,新手常犯的5个错误及解决方法
  • Simulink仿真卡住了?检查下你的Pulse Generator配置!基于时间与基于采样模式的避坑实战
  • DCGAN训练总崩?手把手教你用WB监控损失、可视化生成过程,告别“炼丹”黑盒