代码之家  ›  专栏  ›  技术社区  ›  Pierre P.

来自this和this的shared_用例

  •  3
  • Pierre P.  · 技术社区  · 7 年前

    在里面 this source file 有两类: tcp_connection tcp_server . 在我看来,我已经选择了相关的代码位,但您可能希望参考完整的源代码以获取更多信息。

    class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
    {
    public:
      typedef boost::shared_ptr<tcp_connection> pointer;
    
      void start()
      {
        message_ = make_daytime_string();
    
        boost::asio::async_write(socket_, boost::asio::buffer(message_),
            boost::bind(&tcp_connection::handle_write, shared_from_this()));
      }
    };
    
    class tcp_server
    {    
    private:
      void start_accept()
      {
        tcp_connection::pointer new_connection =
          tcp_connection::create(acceptor_.get_io_service());
    
        acceptor_.async_accept(new_connection->socket(),
            boost::bind(&tcp_server::handle_accept, this, new_connection,
              boost::asio::placeholders::error));
      }
    };
    

    我的问题很简单:我们会用什么 shared_from_this 作为一个 bind 中的参数 async_write this 作为一个 绑定 中的参数 async_accept 作用

    1 回复  |  直到 7 年前
        1
  •  6
  •   sehe    7 年前

    共享指针控制动态分配对象的生存期。每个保持的指针增加一个 参考计数 当所有保持的指针都消失时,引用的对象被释放。

    服务器

    只有一个服务器,并且它不是动态分配的。相反,实例的寿命比接受器(可能还有io_服务)长,因此并非所有异步操作都可以信任对象保持足够长的寿命。

    连接

    每个客户端生成一个新连接,动态分配(使_共享)一个 tcp_connection 实例,然后对其启动异步操作。

    服务器有 保留共享指针的副本,以便在连接上的所有异步操作完成时(例如,由于连接已断开),将 tcp_连接 对象将被释放。

    但是,因为对象必须 当异步操作正在进行时,需要将完成处理程序绑定到共享指针( shared_from_this )而不是 this .