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

主进程如何将客户端连接分配到房间进程

这是一个多进程+多线程的高并发架构,各组件协同工作如下:

系统架构概览

主进程 (main.cpp)
├── 线程池 (userdeal.cpp)  // 处理客户端连接请求
└── 进程池 (房间进程, room.cpp)  // 管理房间内通信├── 接收线程 (accept_fd)  // 接收主进程分配的连接└── 发送线程池 (send_func) // 转发房间内消息

一、线程池(主进程内)

1. 创建与作用
  • 位置main.cppmain()函数
  • 创建代码
    tptr = (Thread *)Calloc(nthreads, sizeof(Thread));
    for(i = 0; i < nthreads; i++) {thread_make(i);  // 创建线程池
    }
    
  • 作用
    • 监听并接受客户端连接(accept()
    • 解析客户端初始请求(创建/加入房间)
    • 不处理具体业务,仅作为"调度器"将连接分配给房间进程
2. 工作流程 (userdeal.cpp)
ClientThreadPoolRoomProcess连接请求accept(connfd)解析请求类型通过管道发送 'C'+connfd标记为房主通过管道发送 'J'+connfd广播新成员加入alt[创建房间][加入房间]ClientThreadPoolRoomProcess
3. 关键代码 (userdeal.cpp)
void dowithuser(int connfd) {// 解析请求头部...if(msgtype == CREATE_MEETING) {// 找到空闲房间进程char cmd = 'C';write_fd(room->pptr[i].child_pipefd, &cmd, 1, connfd);close(connfd); // 主进程关闭连接} else if(msgtype == JOIN_MEETING) {char cmd = 'J';write_fd(room->pptr[i].child_pipefd, &cmd, 1, connfd);close(connfd); // 主进程关闭连接}
}

二、进程池(房间进程)

1. 创建与作用
  • 位置main.cppprocess_make()
  • 创建代码
    for(i = 0; i < nprocesses; i++) {process_make(i, listenfd);  // 创建房间进程
    }
    
  • 特点
    • 每个进程独立管理一个"房间"
    • 进程间完全隔离,避免全局锁竞争
    • 通过socketpair与主进程通信
2. 进程内部线程架构
房间进程 (process_main)
├── 接收线程 (accept_fd):1个
│   └── 接收主进程分配的连接
└── 发送线程池 (send_func):多个└── 转发房间内消息

三、关键协作机制

1. 连接传递机制
1. accept
connfd
2. 解析请求
3. write_fd
'C'/'J'+connfd
4. read_fd
主线程
线程池
房间进程管道
房间进程的accept_fd线程
获取connfd
加入房间用户池
2. 线程/进程职责对比
组件所属进程数量职责
主线程主进程1管理线程/进程池,监听进程状态
线程池主进程N接收连接并分配到房间进程
房间进程子进程M管理独立房间
accept_fd线程房间进程1/进程接收主进程分配的连接
send_func线程房间进程5/进程转发房间内消息

四、资源管理关键点

  1. 连接生命周期

    • 主进程的线程池accept()获取connfd
    • 通过write_fd()connfd传递给房间进程
    • 主进程立即关闭connfd(房间进程接管)
  2. 房间进程状态同步

    // main.cpp的主循环
    if(Read(pipefd, &rc, 1) == 'E') {pthread_mutex_lock(&room->lock);room->pptr[i].child_status = 0; // 标记房间空闲room->navail++;
    }
    
  3. 线程安全控制

    • 主进程:room->lock保护进程池状态
    • 房间进程:user_pool->lock保护连接池

五、设计优势

  1. 层级分离

    • 连接接收 vs 业务处理
    • 房间隔离 vs 进程内并发
  2. 高效资源利用

    主进程:1监听线程 + N接收线程
    房间进程:1连接线程 + 5发送线程
    → 总线程数 = 1 + N + M*(1+5)
    
  3. 错误隔离

    • 单个房间崩溃不影响其他房间
    • 线程崩溃只影响单个房间

六、典型工作流示例

  1. 用户A创建房间

    • 线程池接收连接 → 分配空闲房间进程 → 房间进程标记A为房主
  2. 用户B加入房间

    • 线程池接收连接 → 找到目标房间进程 → 房间进程广播B加入
  3. 房主退出

    • 房间进程检测到房主断开 → 清理房间资源 → 通知主进程房间空闲

这种架构通过三层分配机制(线程池→进程池→线程池)实现高效连接管理和资源隔离,适合高并发会议场景。主进程的线程池专注于连接调度,房间进程内的线程池专注于消息转发,各司其职又通过进程间通信紧密协作。

http://www.xdnf.cn/news/1296883.html

相关文章:

  • 数巅中标中建科技AI知识库项目,开启建筑业数智化新篇章
  • 项目日志框架与jar中日志框架冲突 解决
  • MFC的使用——使用ChartCtrl绘制曲线
  • DataHub IoT Gateway:工业现场设备与云端平台安全互联的高效解决方案
  • 使用HalconDotNet实现异步多相机采集与实时处理
  • 零信任架构(Zero Trust Architecture, ZTA)(通过动态验证和最小权限控制,实现对所有访问请求的严格授权和持续监控)
  • Kafka消费者组
  • OpenCV阈值处理详解
  • Docker pull拉取镜像命令的入门教程
  • K8s学习----Namespace:资源隔离与环境管理的核心机制
  • Rabbitmq+STS+discovery_k8s +localpv部署排坑详解
  • 希尔排序专栏
  • C++ 仿RabbitMQ实现消息队列项目
  • Trae x Figma MCP一键将设计稿转化为精美网页
  • 通信算法之313:FPGA中实现滑动相关消耗DSP资源及7045/7035的乘法器资源
  • Mysql基本使用语句(一)
  • 读《精益数据分析》:移情(Empathy)—— 验证真实需求,避免伪需求陷阱
  • OpenLayers与Vue.js结合实现前端地图应用
  • 51单片机-驱动LED模块教程
  • 机器视觉之图像处理篇
  • 相较于传统AR作战环境虚拟仿真系统,其优势体现在哪些方面?
  • Flutter 顶部导航标签组件Tab + TabBar + TabController
  • 读From GPT-2 to gpt-oss: Analyzing the Architectural Advances
  • 线上故障定位:从报警到根因的实战指南
  • 计算机如何进行“卷积”操作:从图像到矩阵的奥秘
  • 设计模式笔记_行为型_责任链模式
  • [机器学习]08-基于逻辑回归模型的鸢尾花数据集分类
  • 高分辨率PDF压缩技巧:保留可读性的最小体积方案
  • 通过网页调用身份证阅读器http websocket方法-华视电子————仙盟创梦IDE
  • 【数据结构初阶】--排序(一):直接插入排序,希尔排序