高并发服务器Channel模块实现精要

Channel模块实现概述

Channel模块在高并发服务器中负责封装文件描述符(fd)及其相关事件(如可读、可写、错误等),通常与Reactor模式中的事件分发器(如Epoll)协同工作。以下是Channel模块的核心实现要点。

核心数据结构

Channel模块通常包含以下成员变量:

  • int fd_:管理的文件描述符。
  • uint32_t events_:关注的事件(如EPOLLIN、EPOLLOUT)。
  • uint32_t revents_:实际触发的事件(由Epoll返回)。
  • std::function<void()> readCallback_:可读事件回调函数。
  • std::function<void()> writeCallback_:可写事件回调函数。
  • std::function<void()> errorCallback_:错误事件回调函数。
class Channel {
public:
    using EventCallback = std::function<void()>;
    
    Channel(EventLoop* loop, int fd);
    ~Channel();

    void handleEvent(); // 处理事件回调
    void setReadCallback(EventCallback cb);
    void setWriteCallback(EventCallback cb);
    void setErrorCallback(EventCallback cb);

    void enableReading(); // 注册可读事件
    void enableWriting(); // 注册可写事件
    void disableWriting(); // 取消可写事件
    void disableAll();     // 取消所有事件

    int fd() const { return fd_; }
    uint32_t events() const { return events_; }
    void set_revents(uint32_t revents) { revents_ = revents; }

private:
    EventLoop* loop_;  // 所属EventLoop
    int fd_;
    uint32_t events_;  // 关注的事件
    uint32_t revents_; // 触发的事件
    EventCallback readCallback_;
    EventCallback writeCallback_;
    EventCallback errorCallback_;
};

事件处理逻辑

handleEvent()是Channel的核心方法,根据revents_调用对应的回调函数:

void Channel::handleEvent() {
    if (revents_ & EPOLLERR) {
        if (errorCallback_) errorCallback_();
    }
    if (revents_ & (EPOLLIN | EPOLLPRI | EPOLLRDHUP)) {
        if (readCallback_) readCallback_();
    }
    if (revents_ & EPOLLOUT) {
        if (writeCallback_) writeCallback_();
    }
}

与EventLoop的交互

Channel通过EventLoop注册或更新事件到Epoll:

  • enableReading()调用EventLoop::updateChannel(this)将事件添加到Epoll。
  • disableAll()调用EventLoop::removeChannel(this)从Epoll中移除。
void Channel::enableReading() {
    events_ |= EPOLLIN;
    loop_->updateChannel(this);
}

void Channel::disableAll() {
    events_ = 0;
    loop_->removeChannel(this);
}

注意事项

  1. 线程安全:Channel的方法应在EventLoop所在的IO线程调用,避免竞态条件。
  2. 资源管理:Channel不拥有fd_的生命周期,需由更高层(如TcpConnection)管理。
  3. 事件优先级:EPOLLERR事件应优先处理,其次是EPOLLIN和EPOLLOUT。

性能优化

  • 避免频繁更新Epoll:通过events_的局部变量判断是否需要调用EventLoop::updateChannel
  • 回调函数空检查:在调用回调前检查是否为空,减少分支预测开销。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值