2

当套接字关闭/关闭然后删除(即运行析构函数并释放内存)时,完成处理程序会发生什么?AFAIK 在关闭后关闭所有完成处理程序将在下次轮询循环时收到错误代码。但是,如果 socked 在处理程序有机会运行之前就被删除了,会发生什么?在调度事件处理程序之前删除套接字是否可以?

4

2 回答 2

2

在执行未完成的处理程序之前删除套接字是安全的。未完成的操作将设置它们的处理程序以调用boost::asio::error::operation_aborted. 应用程序代码有责任确保处理程序不会调用已删除套接字上的操作。

具体来说,销毁一个IO对象,比如socket,会导致IO对象的服务被销毁。SocketService要求将destroy()隐式取消异步操作。未完成的异步操作将尝试尽快完成。这会导致取消操作的处理程序被传递错误代码boost::asio::error::operation_aborted,并安排在io_service. 如果这些处理程序是从io_service处理事件循环的线程中调用的,或者io_service是被破坏的,则这些处理程序将从中删除。

于 2013-01-28T16:49:56.950 回答
1

保证调用所有处理程序。如果套接字已关闭 - 将使用一些错误代码调用处理程序。

通常,您需要使用此保证来使用 boost::enable_shared_from_this 控制对象的生命周期。

class Writer : boost::enable_shared_from_this<Writer>
{  
  boost::asio::socket scoket_;

  ...

  void StartWrite() 
  {
      boost::asio::async_write(socket_,
          boost::asio::buffer(buffer_, bytes_sent_),
          boost::bind(&Writer::Handler, shared_from_this,
              boost::asio::placeholders::error));
  ...
  void Handler(boost::system::error_code const& err) {...}

使用这种方法,您的套接字对象将比所有待处理的处理程序寿命更长。

于 2013-01-28T10:27:38.237 回答