0

来自http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_server.cpp

typedef boost::shared_ptr<chat_session> chat_session_ptr;



  void start_accept()
      {
        chat_session_ptr new_session(new chat_session(io_service_, room_));
        acceptor_.async_accept(new_session->socket(),
            boost::bind(&chat_server::handle_accept, this, new_session,
              boost::asio::placeholders::error));
      }

void handle_accept(chat_session_ptr session,
      const boost::system::error_code& error)
  {
    if (!error)
    {
      session->start();
    }

    start_accept();

为什么new_session共享的ptr没有被破坏?如果我正确理解acceptor_.async_accept返回作为它的异步调用?start_accept所以当函数返回时共享ptr不会被删除。

并且由于 new_session 类有一个套接字成员,因此套接字的生命周期与这个 new_session 绑定在一起,所以读写 tcp 消息的能力也可以吗?不是吗?

----编辑---基于比利奥尼尔的回答:我还有一个问题

所以 new_session 将永远存在,除非发生错误或我强行关闭服务器?

4

2 回答 2

0

是的,chat_session只要它是“活跃的”,即不会发生错误,它就会一直存在。它的生命周期可以分为两部分:

1) 在start调用其成员函数之前,chat_session实例保持活动状态,因为shared_ptr<chat_session>绑定到acceptor_. 当完成处理程序被调用时,它会从io_service队列中删除并销毁 - 使用它的shared_ptr<chat_session>. 但是,如果成功接受连接,完成处理程序将启动第二阶段:

2)当chat_session::start被调用时,chat_session将自己注册到chat_room管理器中

room_.join(shared_from_this());

它将 a 存储shared_ptr<chat_session>在某个容器中。这shared_ptr将从 中的容器中删除,chat_session::start错误时调用。

(实际上,即使没有这个注册,chat_session也会因为shared_from_this每个异步操作使用的习惯用法而保持活动状态。)

于 2013-05-27T12:25:43.240 回答
0

boost::bindshared_ptr在这种情况下,返回一个包含被引用副本的函数对象new_sessionasync_accept可能是异步的,但它需要存储目标函数对象的副本,以便在异步请求完成时调用函数。

于 2013-05-27T07:04:54.140 回答