房间进程与主进程之间的通信及状态更新

房间进程(子进程)主进程进程池(Room对象)房间管理模块发送状态信号信号类型:'E' - 房间空闲'Q' - 用户退出解析信号类型获取进程索引返回索引i更新状态room->>pptr[i].child_status = 0调整可用计数room->>navail++记录日志printf("room %d free", pid)获取进程索引返回索引i更新用户计数room->>pptr[i].total--记录日志printf("user quit room %d", pid)alt[收到'E'(空闲)信号][收到'Q'(用户退出)信号]房间进程(子进程)主进程进程池(Room对象)房间管理模块

关键流程说明:

1. 信号发送阶段(蓝色区域)
房主退出
普通用户退出
房间进程
事件类型
发送'E'信号
发送'Q'信号
主进程
  • ’E’信号:当房主退出时,房间进程通过管道发送’E’字符
  • ’Q’信号:当普通用户退出时,房间进程发送’Q’字符
2. 信号处理阶段(主进程)
'E'
'Q'
接收信号
信号类型
标记房间空闲
减少用户计数
增加可用计数
更新状态
3. 状态更新细节

对于’E’信号处理(绿色区域)

// main.cpp 片段
if (rc == 'E') {
    pthread_mutex_lock(&room->lock);
    room->pptr[i].child_status = 0;  // 状态:0=空闲
    room->navail++;                  // 可用房间数+1
    pthread_mutex_unlock(&room->lock);
    printf("room %d is now free\n", room->pptr[i].child_pid);
}

对于’Q’信号处理(橙色区域)

// main.cpp 片段
else if (rc == 'Q') {
    pthread_mutex_lock(&room->lock);
    room->pptr[i].total--;  // 房间用户数-1
    pthread_mutex_unlock(&room->lock);
    printf("user quit room %d\n", room->pptr[i].child_pid);
}

通信通道示意图

房间管理
进程池
管道1
管道2
管道N
可用计数navail
房间管理
状态数组
进程池
房间进程1
主进程
房间进程2
房间进程N

技术实现要点

  1. 管道通信机制

    // 房间进程发送信号
    void send_signal(int pipefd, char cmd) {
        char buf[1] = {cmd};
        writen(pipefd, buf, 1);
    }
    
    // 主进程接收信号
    char receive_signal(int pipefd) {
        char buf[1];
        Readn(pipefd, buf, 1);
        return buf[0];
    }
    
  2. 线程安全更新

    void update_room_status(int index, int status) {
        pthread_mutex_lock(&room->lock);
        room->pptr[index].child_status = status;
        if (status == 0) room->navail++;
        pthread_mutex_unlock(&room->lock);
    }
    
  3. 状态同步保障

    发送信号
    房间进程
    主进程
    加锁
    更新状态
    更新计数
    解锁
    记录日志

这种设计确保了在多进程环境下状态更新的原子性和一致性,是高性能服务器程序的核心模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值