【发布时间】:2013-03-15 18:11:58
【问题描述】:
我正在使用 Boost asio 打开多个套接字我使用一个集合,该集合具有指向具有所有套接字信息的自定义类的共享指针。这个类还具有async_receive 的handle_read 函数,因为我需要对每个接收做不同的事情,我不能绑定额外的参数。
我遇到的问题是,当我关闭套接字时,我删除了对该指针的最后一个引用,因此在没有任何有效引用的情况下调用 handle_read 函数,然后代码就中断了。
void SocketsAPI::do_close(const SocketInfo socket)
{
log("do_close");
if (!socket.m_socket || !socket.m_socket->is_open()) {
return;
}
boost::system::error_code errorcode;
socket.m_socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both, errorcode);
if (errorcode) {
trace("Closing failed: ", errorcode.message());
}
socket.m_socket->close(errorcode);
if (errorcode) {
trace("Closing2 failed: ", errorcode.message());
}
mapType::iterator iter = sockets.find(socket.key);
if (iter != sockets.end()) {
sockets.erase (iter);
}
log("do_close end");
}
确实,我不希望调用handle_read 函数,但我无法避免它,而且在多线程实现中更糟糕的是(多个线程调用io_service.run())handle_read 将被调用而关闭仍在处理中,因此“this”对象将在处理程序的任何位置释放。
【问题讨论】:
标签: sockets boost-asio boost-thread