muduo 中,大量是用  smart point 省掉自己管理内存.下面开着源码参看。

question 1:EventLoop 的生命周期

answer 1: 建立在栈中,离开范围以后,自动释放。

void EventLoopThread::threadFunc()
{EventLoop loop;//这里声明了本地epoller,也就是线程当地的epollerif (callback_){callback_(&loop);}{MutexLockGuard lock(mutex_);// 一般情况是EventLoopThread对象先析构,析构函数调用loop_->quit() 使得loop.loop() 退出循环// 这样threadFunc 退出,loop栈上对象析构,loop_ 指针失效,但此时已经不会再通过loop_ 访问loop,// 故不会有问题。loop_ = &loop;cond_.notify();}loop.loop();//assert(exiting_);loop_ = NULL;
}

question 2:EventLoop 有什么含指针类成员?

answer 2: (1) vector< Channel *> attiveChannels_; 只是存放,不管理里面的 Channel 死活.

          (2) scoped_ptr<Poller> poller_; => 自动析构

        (3) scoped_ptr<TimerQueue> timeQueue; => 自动析构

      (4) scoped_ptr<Channel> wakeripChannel_; 自动析构

得:EventLoop 掌管着 2,3,4 的生命

question 3: TcpClient 的生命周期?

answer 3:一般在栈上,跟程序差不多。

question 4: TcpClient 有什么含指针的成员?

answer 4: (1) shared_ptr<Connector> ConnectorPtr connector_; =>自动析构

       (2) shared_ptr<TcpConnection> TcpConnectionPtr connection_; =>自动析构

TcpClient::~TcpClient()
{LOG_INFO << "TcpClient::~TcpClient[" << name_<< "] - connector " << get_pointer(connector_);TcpConnectionPtr conn;{MutexLockGuard lock(mutex_);conn = connection_;}// 你这里什么情况下 conn 会为空啊,未连接的时候if (conn){// FIXME: not 100% safe, if we are in different threadCloseCallback cb = boost::bind(&detail::removeConnection, loop_, _1);loop_->runInLoop(boost::bind(&TcpConnection::setCloseCallback, conn, cb));}else{connector_->stop();//关闭连接器// FIXME: HACKloop_->runAfter(1, boost::bind(&detail::removeConnector, connector_));//connector会自己在Tcpclient之后析构
  }
}

question 5: TcpConnection 的生命周期

answer 5:两种情况,(1)对方断开连接;(2)自己退出;

     (1)当遇到别人断开连接 => channel_->handleEvent() -> connection_->handleClose();

handleClose(){ 设置状态为非链接 => 清空事件

        => 新建一个 TcpConnectionPtr 对象,预防被析构。

            => 调用 connectionCallback() 告诉用户

          => 调用 closeCallback() => removeConnection()

       }

removeConnection{ 将 TcpClient 中的  connectoin_ 置空,假如 handleClose() 不新建,这里就析构了

          ,然后后面调用 TcpConnection::connectDestroyed 就会失败

          }

connectiDestroyed{ 将 channel_  从 poller_ 中删除 }

最后,回到 handleClose() ,TcpConnectionPtr 析构掉,带有的 Socket, Channel 也就析构掉了。

(2) 当自己退出的话,就直接从connectDestory()开始执行.

详情,参照源码看。

然后,TcpServer 的话,跟 TcpClient 比,多了个map<string,TcpConnectionPtr> connections_;

处理断开的话,就多了一个,从 map 中去除。

转载于:https://www.cnblogs.com/cycxtz/p/4949635.html

EventLoop,TcpClient,TcpServer 中的生命周期相关推荐

  1. [JavaWeb-Servlet]Servlet中的生命周期方法(init,service,destroy)

    Servlet中的生命周期方法: @Override public void init(ServletConfig servletConfig) throws ServletException {}1 ...

  2. java session 生命周期_Java中httpsession生命周期

    Java中httpsession生命周期 HttpSession会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束,那么从用户访问到退出浏览器它的生命周期过程如下: 1. 当浏览器A向服务 ...

  3. Unity中场景生命周期的监听: EditorSceneManager

    本文分享Unity中场景生命周期的监听: EditorSceneManager 在Unity开发中, 有时我们需要在场景的某些生命周期时做一些特定的操作, 特别是在Editor模式下的一些工具代码. ...

  4. Fragment在ViewPager中的生命周期

    转载自 hdszlk的博客     原文链接:https://www.2cto.com/kf/201607/530540.html 1.一直以来的疑问 Fragment在ViewPager到底经历了哪 ...

  5. 小程序中的生命周期有哪些?

    一.小程序中生命周期的分类 小程序中的生命周期有以下三种: (1)应用生命周期 小程序的生命周期函数是在app.js中调用,通过App(Object)函数用来注册一个小程序,指定其小程序的生命周期回调 ...

  6. uni-app中的生命周期方法

    uni-app中的生命周期方法 -- 重点面试题 概念:LifeCycle Methods,方法名固定,无需自己调用,到了指定的时刻,会被框架自动调用.  1.应用级生命周期方法(App.vue) - ...

  7. flutter中的生命周期

    前言 和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数提现在了State上面.理解flutter的生命周期,对我们写出一个 ...

  8. java 线程 状态 图_Java线程中的生命周期和状态控制图文详解

    这篇文章主要介绍了Java线程的生命周期和状态控制,需要的朋友可以参考下 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于 ...

  9. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行 ...

  10. Taro+react开发(45)taro中组件生命周期

    组件生命周期# 每一个组件都有几个你可以重写以让代码在处理环节的特定时期运行的"生命周期方法".方法中带有前缀 will 的在特定环节之前被调用,而带有前缀 did 的方法则会在特 ...

最新文章

  1. Spring中应用反射机制浅析
  2. 买衣服送粉丝,人气美女出新招
  3. 分割2021算法合集
  4. C# .NET MVC 基础提供程序在 Open 上失败
  5. python rbf神经网络_原创,基于径向基函数(RBF)神经网络RBF网络的举例应用!
  6. Flash Alter v1.0 个性化Flash轮播图文播放器
  7. opencv的两个错误
  8. 微软的基础服务器,微服务器当道 微软云端基础构架揭秘
  9. mysql可视化工具路径访问_windows开启3306端口并用可视化工具访问远程mysql(授权访问)...
  10. 你确定了项目,就不要乱变了
  11. [JSOI2016]病毒感染[dp]
  12. Ghost网络克隆详细步骤教程
  13. 【NOI2002】银河英雄传说
  14. python中sorted函数的用法_Python中map,reduce,filter和sorted函数的使用方法
  15. 如何保证测试的覆盖率
  16. 推荐算法架构1:召回
  17. 神仙工具!百度网盘资源一键转存阿里云盘,YYDS
  18. 学习日志2:ARM开发板—触摸屏
  19. 一个孩子的心愿(大冰,感动)
  20. 360漏洞修复网管版小软件不错

热门文章

  1. Java poi操作导入导出excel
  2. 配置Nginx——在线生成配置文件
  3. Java基础SQL优化---面试题【一】
  4. Windows下安装和配置Java JDK
  5. C++11 实现线程池
  6. IO多路复用之select、poll、epoll介绍
  7. C++ 长字符串换行
  8. ios去掉字符串中的某个字符_Python中有用的字符串方法
  9. php动态交叉表,SQLServer:SQL实现动态交叉表
  10. 软件质量管理体系 type:pdf_制造型企业构建完整的质量管理体系的思路要点