当套接字关闭/关闭然后删除(即运行析构函数并释放内存)时,完成处理程序会发生什么? SFA之后关闭所有完成处理程序的AFAIK将在下次循环轮询时收到错误代码。但是如果在处理程序有机会运行之前删除了socked会发生什么?在调度事件处理程序之前删除套接字是否可以?
答案 0 :(得分:2)
在执行未完成的处理程序之前删除套接字是安全的。未完成的操作将设置为使用boost::asio::error::operation_aborted
调用其处理程序。应用程序代码负责确保处理程序不会在已删除的套接字上调用操作。
有关详细信息,destroying IO对象(如套接字)将导致IO对象的服务被破坏。 SocketService
要求声明destroy()
将隐式取消异步操作。出色的异步操作将尽快完成。这会导致取消操作的处理程序传递错误代码boost::asio::error::operation_aborted
,并在io_service
内调度延迟调用。如果从处理事件循环的线程调用这些处理程序,或io_service
为destroyed,则会从io_service
中删除这些处理程序。
答案 1 :(得分:1)
保证所有处理程序都被调用。如果socket被关闭 - 将使用一些错误代码调用处理程序。
通常,您需要使用此保证来使用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) {...}
使用这种方法,您的套接字对象将比所有待处理的处理程序更长。