C++ 促进asio共享“来自”;“多重”;这

C++ 促进asio共享“来自”;“多重”;这,c++,boost,boost-asio,shared-ptr,C++,Boost,Boost Asio,Shared Ptr,我在boost ASIO TCP套接字上有一个包装器类。该类对使用TCP套接字的连接实际逻辑采用弱ptr。这样我就可以确保连接不会消失,同时还有一些挂起的异步操作-比如async\u read\u some() 但是每次读/写时复制2个共享的PTR看起来太多了。这是唯一的办法吗?还是有一种有效的方法?目前,MyCxn和\u频道的生存期都是相同的,因此我只能保留cxn。但可能会出现频道重置的情况。谁拥有什么?一个连接是否拥有一个客户或是另一个客户?^What@RichardHodges说。因为您可

我在boost ASIO TCP套接字上有一个包装器类。该类对使用TCP套接字的
连接
实际逻辑采用
弱ptr
。这样我就可以确保
连接
不会消失,同时还有一些挂起的异步操作-比如
async\u read\u some()


但是每次读/写时复制2个共享的PTR看起来太多了。这是唯一的办法吗?还是有一种有效的方法?目前,
MyCxn
\u频道
的生存期都是相同的,因此我只能保留
cxn
。但可能会出现频道重置的情况。

谁拥有什么?一个连接是否拥有一个客户或是另一个客户?^What@RichardHodges说。因为您可以使用std::shared_ptr()的“别名构造函数”,所以连接拥有客户端。客户端是连接的共享成员。所以我尝试了这个方法,但我想不出一个方法来实现这个功能。我认为,只有当我们必须给一个成员作为外部共享指针时,它才能灵活地工作。不是在我的特定情况下。@sehe所以我想如果客户机和连接都可以独立删除,那么唯一的选择就是在每个异步操作中复制两个共享的ptr?
template <typename Connection>
struct TCPClient : public enable_shared_from_this<TCPClient> {

 std::weak_ptr<Connection> cxn_;
 TCPClient (weak_ptr<Connection> cxn) : cxn_(cxn) {}

 void something ()
 {  
     // Give the handler to async_op
     auto cxn = cxn_.lock();
     if (!cxn) return;

     some_asio_async_op( [cxn = std::move(cxn)] ()
                        {
                            // do some stuff
                            cxn->notify();
                         });
}


struct MyCxn : public enable_shared_from_this<MyCxn> {

  shared_ptr<TCPClient<MyCxn>> _channel;

  setConnection ()
  {
       _channel = make_shared<TCPClient<MyCxn>>(shared_from_this())
  }

  start()
  {
      setConnection();
      something();
  }
}
 // Give the handler to async_op
 some_async_op( [self = shared_from_this()] ()
               {
                  // do some stuff
                  auto cxn = cxn_.lock()
                  if (cxn)
                      cxn->notify();
               });