谁能告诉我在什么条件下boost::asio
方法io_service::run()
会返回?的文档文档io_service::run()
似乎表明,只要有工作要做或调度处理程序,run()
就不会返回。
我问这个的原因是我们有一个旧的 https 客户端,它联系服务器并执行 http POST。客户端中的关注点分离与我们想要的有点不同,所以我们正在改变一些关于它的东西,但我们遇到了问题。
现在,客户端基本上有一个错误命名的connect()
调用,它有效地驱动了与服务器的整个协议对话。调用从connect()
创建一个boost::asio::ip::tcp::resolver
对象并调用::async_resolve()
它开始。这将启动一个链,在该链中asio
从 asio 回调中进行新调用。
void connect()
{
m_resolver.async_resolve( query, bind( &clientclass::resolve_callback, this ) );
thread = new boost::thread( bind( &boost::asio::io_service::run, m_io_service ) );
}
void resolve_callback( error_code & e, resolver::iterator i )
{
if (!e)
{
tcp::endpoint = *i;
m_socket.lowest_layer().async_connect(endpoint, bind(&clientclass::connect_callback,this,_1,++i));
}
}
void connect_callback( error_code & e, resolve::iterator i )
{
if (!e)
{
m_socket.lowest_layer().async_handshake(boost::asio::ssl::stream_base::client,
bind(&clientclass::handshake_callback,this,_1,++i));
}
}
void handshake_callback( error_code &e )
{
if (!e)
{
mesg = format_hello_message();
http_send( mesg, bind(&clientlass::hello_resp_handler,this,_1,_2) );
}
}
void http_send( stringstream & mesg, reply_handler handler )
{
async_write(m_socket, m_request_buffer, bind(&clientclass::write_complete_callback,this,_1,handler));
}
void write_comlete_callback( error_code &e, reply_handler handler )
{
if (!e)
{
async_read_until(m_socket,m_reply_buffer,"\r\n\r\n", bind(&clientclass::handle_reply,this,handler));
}
}
...
无论如何,这将通过协议继续进行,直到协议对话完成。从这里的代码你可以看到,当connect()
在主线程上运行时,所有后续的回调和请求都返回到在connect()
. 这是“工作”代码。
当我试图打破这个链并通过外部接口公开它时,它停止工作。特别是,我在对象handle_handshake()
之外进行了调用。clientclass
然后http_send()
是接口的一部分(或被外部接口调用),它创建一个新的工作线程来调用 io_service::run()。发生的情况是即使async_write()
已被调用并且即使write_complete_callback()
没有返回, io_service::run() 也会退出。它没有错误地退出并声称没有调度任何处理程序,但还有“工作”要做吗?
所以我想知道io_service::run()
“工作”的定义是什么?这是一个待处理的请求吗?为什么io_service::run()
在现有代码中的这个请求和响应链中永远不会返回,但是当我尝试再次启动线程并启动新链时,它几乎在完成工作之前立即返回?