前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EventLoop,TcpClient,TcpServer 中的生命周期

EventLoop,TcpClient,TcpServer 中的生命周期

作者头像
forxtz
发布2020-10-10 16:43:33
5040
发布2020-10-10 16:43:33
举报
文章被收录于专栏:源懒由码源懒由码

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

question 1:EventLoop 的生命周期

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

void EventLoopThread::threadFunc()
{
  EventLoop loop;//这里声明了本地epoller,也就是线程当地的epoller

  if (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 thread
    CloseCallback cb = boost::bind(&detail::removeConnection, loop_, _1);
    loop_->runInLoop(
        boost::bind(&TcpConnection::setCloseCallback, conn, cb));
  }
  else
  {
    connector_->stop();//关闭连接器
    // FIXME: HACK
    loop_->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 中去除。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-11-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档