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