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

网站建设优化合同自己做博客网站

网站建设优化合同,自己做博客网站,营销型网站案例,视频网站建设教程Muduo库源码剖析(一)——Channel 说明 本源码剖析是在muduo基础上#xff0c;保留关键部分进行改写分析。 要点总结 事件分发器 event dispatcher中最重要的两个类型 channel 和 Poller Channel可理解为通道#xff0c;poller往通道传输数据(事件发生情况)。 EventLoop…Muduo库源码剖析(一)——Channel 说明 本源码剖析是在muduo基础上保留关键部分进行改写分析。 要点总结 事件分发器 event dispatcher中最重要的两个类型 channel 和 Poller Channel可理解为通道poller往通道传输数据(事件发生情况)。 EventLoop包含多个channel 和一个 Poller Channel相当于是对socket的事件处理封装包含了socket的详细信息scoket以及感兴趣的事件都在channel里 channel是muduo库负责注册读写事件的类并保存了fd读写事件发生时调用的回调函数如果poll/epoll有读写事件发生则将这些事件添加到对应的通道中。 一个channel对应唯一EventLoop一个EventLoop可以有多个channel。 Channel类不负责fd的生存期fd的生存期是由socket决定的断开连接关闭描述符。 当有fd返回读写事件时调用提前注册的回调函数处理读写事件 头文件中只给类的前置声明而在源文件中再给出头文件包含因为源文件会被编程动态库.so, 减少对外暴露 weak_ptr 用于观察绑定对象的状态并且可以尝试提升为shared_ptr Channel这个模块对应Reactor模型上的 Demultiplex 多路复用器 重点代码详解 // Channel.h #pragma once#include noncopyable.h #include Timestamp.h#include functional #include memory// 头文件中只给类的前置声明而在源文件中再给出头文件包含 // 因为源文件会被编程动态库.so, 减少对外暴露 class EventLoop;class Channel : noncopyable { public:using EventCallback std::functionvoid();using ReadEventCallback std::functionvoid(Timestamp);Channel(EventLoop *loop, int fd);~Channel();// fd得到poller通知后调用其处理事件void handleEvent(Timestamp recevieTime);void setReadCallback(ReadEventCallback cb) { readCallback_ std::move(cb); }void setWriteCallback(EventCallback cb) { writeCallback_ std::move(cb); }void setCloseCallback(EventCallback cb) { closeCallback_ std::move(cb); }void setErrorCallback(EventCallback cb) { errorCallback_ std::move(cb); }// 防止当Channel的所有者被手动remove掉时Channel 仍在执行回调void tie(const std::shared_ptrvoid); // 检测资源存活状态int fd() const { return fd_; }int events() const { return events_; }void set_revents(int revt) { revents_ revt; }// 设置fd相应的事件状态// enableReading 让fd对读事件感兴趣// update()底层也是调用 epoll_ctlvoid enableReading() { events_ | kReadEvent; update(); }void disableReading() { events_ ~kReadEvent; update(); }void enableWriting() { events_ | kWriteEvent; update(); }void disableWriting() { events_ ~kWriteEvent; update(); }void disableAll() { events_ kNoneEvent; }int index() { return index_; }void set_index(int idx) { index_ idx; }// oneloop per thread// 当前Channel所属的eventloopEventLoop* ownerLoop() {return loop_;}void remove();private:void update();void handleEventWithGuard(Timestamp recvTime);static const int kNoneEvent; // 感兴趣的事件类型该变量表示不感兴趣任何事件static const int kReadEvent; static const int kWriteEvent; EventLoop *loop_; // 事件循环const int fd_; //fd poller监听的对象int events_; // 注册感兴趣的事件int revents_; // poller返回的具体发生的事件类型可读可写int index_;std::weak_ptrvoid tie_; // 用于观察shared_ptr的状态bool tied_;// 因为Channel里能得知fd最终发生的具体事件revents_// 故它负责调用对应的回调ReadEventCallback readCallback_;EventCallback writeCallback_;EventCallback closeCallback_;EventCallback errorCallback_;};// Channel.cpp #include Channel.h //#include EventLoop.h #include Logger.h#include sys/epoll.hconst int Channel::kNoneEvent 0; const int Channel::kReadEvent EPOLLIN | EPOLLPRI; const int Channel::kWriteEvent EPOLLOUT;Channel::Channel(EventLoop *loop, int fd): loop_(loop), fd_(fd), events_(0), revents_(0), index_(-1), tied_(false) { }Channel::~Channel() { }// ??channel的tie方法什么时候调用过 void Channel::tie(const std::shared_ptrvoid obj) {tie_ obj;tied_ true; }// 当改变Channel所表示fd的events事件后update负责在poller里更改fd相应事件--epoll_ctl // EventLoop has ChannelList Poller void Channel::update() {// 通过Channel所属的EventLoop调用Poller的相应方法注册fd的events事件// [TODO]// loop_-updateChannel(this); }// 在Channel所属的EventLoop中把当前Channel删除 void Channel::remove() {// [TODO]// loop_-removeChannel(this); }// fd得到poller通知后处理事件 void Channel::handleEvent(Timestamp receiveTime) {if(tied_) // 资源存活{std::shared_ptrvoid guard tie_.lock();if(guard){handleEventWithGuard(receiveTime);}}else {handleEventWithGuard(receiveTime);} }// 根据Poller通知的Channel发生的具体事件调用相应的回调 void Channel::handleEventWithGuard(Timestamp receiveTime) {LOG_INFO(channel handleEvent revents:%d\n, revents_);// EPOLLHUP 表示读写都关闭if((revents_ EPOLLHUP) !(revents_ EPOLLIN)){if(closeCallback_){closeCallback_();}}if(revents_ EPOLLERR){if(errorCallback_){errorCallback_();}}if(revents_ (EPOLLIN | EPOLLPRI)){if(readCallback_){readCallback_(receiveTime);}}if(revents_ EPOLLOUT){if(writeCallback_){writeCallback_();}}} 参考资料 陈硕. 《LInux多线程服务端编程》 施磊. 《手写CMuduo网络库》
http://www.hkea.cn/news/14565252/

相关文章:

  • html5作业 建设网站保定建站模板
  • 合肥快速建站模板网站服务器租用一般费用
  • 做电影网站用什么格式好wordpress 画线不显示不出来
  • 公司怎么建网站做推广移动网站性能
  • 网站建设应用潮州外贸网站建设
  • 湖州本地做网站珠海做网站优化的公司
  • 邯郸网站建设找谁音乐 版权 做视频网站
  • 环保部网站建设项目重大变动原阳网站建设
  • 廊坊网站建设联系青橙网络苏州做网站建设
  • 商城网站建设二次开发台海最新24小时消息
  • 网站开发项目进度安排宁德商城网站建设
  • 丹阳做公司网站wordpress 小程序源码
  • 网站开发毕设开题报告怎么写个人建什么网站好
  • 用jsp做学校网站网页传奇游戏排行榜前十名端游
  • 焦作住房和城乡建设局网站seo整站优化费用
  • 南希网站建设如何用dw做网站前端
  • 肇庆中小企业网站制作一号建站
  • 网站建设合同英文版网上做环评立项的网站是哪个
  • 网站地图可以自己做么自己免费怎么制作网站吗
  • 网站定制开发费用多少网站备案到公司名称
  • 站长工具app官方下载购物网站开发需求文档
  • 网站维护 上海淘宝购物网站开发有什么功能
  • 可以建网站的公司找不到网站后台怎么办
  • 网站权重能带来什么作用网站源码在线查看
  • 南川区 网站集约化建设方案四川招标信息网官网
  • 网站开发了下载文件需要网页设计公司开设需要投资多少钱
  • 企网站建设郑州小程序开发价格
  • 五合一网站做优化好用吗盘锦化工网站建设
  • seo针对网站做策划大公司的网站都找谁设计
  • 重庆南昌网站建设石家庄关键词优化平台