asio::io_context::run_one() 与 while()
asio::io_context::run_one() with while()
为什么在下面的代码中使用 asio::io_context::run_one()
时需要 while
循环?如果我们不使用 while
循环会怎样,如下所示?
size_t numberOfHandler = sock.io_service().run_one();
void set_result(optional<error_code>* a, error_code b)
{
a->reset(b);
}
template <typename MutableBufferSequence>
void read_with_timeout(tcp::socket& sock,
const MutableBufferSequence& buffers)
{
optional<error_code> timer_result;
deadline_timer timer(sock.io_service());
timer.expires_from_now(seconds(1));
timer.async_wait(boost::bind(set_result, &timer_result, _1));
optional<error_code> read_result;
async_read(sock, buffers,
boost::bind(set_result, &read_result, _1));
sock.io_service().reset();
while (sock.io_service().run_one())
{
if (read_result)
timer.cancel();
else if (timer_result)
sock.cancel();
}
if (*read_result)
throw system_error(*read_result);
}
您需要使用 while 循环来处理所有处理程序,以便在超时结束并且无法在该超时时间内读取数据时抛出异常。
async_wait
的处理程序先于async_read
的处理程序执行的情况意味着套接字无法在1秒内读取数据。
1. run_one is called
2. handler passed into async_wait is called
3. timer_result is set
4. else if (timer_result) is processed
5. sock.cancel() is called [ cancel() queues handler with error code !!
which indicates that read operation was aborted]
6. handler passed into async_read is queued
传递给 async_read
的处理程序已排队,但何时调用?只能被run_one
调用。如果不调用此处理程序,则无法设置 read_result
。那么,你想如何指示超时无法读取数据的情况? read_result
只能通过在run_one
中调用handler来设置。这就是为什么您需要在循环内处理 run_one
来调用处理程序,该处理程序设置 read_result
可选,错误代码表示读取操作中止。
为什么在下面的代码中使用 asio::io_context::run_one()
时需要 while
循环?如果我们不使用 while
循环会怎样,如下所示?
size_t numberOfHandler = sock.io_service().run_one();
void set_result(optional<error_code>* a, error_code b)
{
a->reset(b);
}
template <typename MutableBufferSequence>
void read_with_timeout(tcp::socket& sock,
const MutableBufferSequence& buffers)
{
optional<error_code> timer_result;
deadline_timer timer(sock.io_service());
timer.expires_from_now(seconds(1));
timer.async_wait(boost::bind(set_result, &timer_result, _1));
optional<error_code> read_result;
async_read(sock, buffers,
boost::bind(set_result, &read_result, _1));
sock.io_service().reset();
while (sock.io_service().run_one())
{
if (read_result)
timer.cancel();
else if (timer_result)
sock.cancel();
}
if (*read_result)
throw system_error(*read_result);
}
您需要使用 while 循环来处理所有处理程序,以便在超时结束并且无法在该超时时间内读取数据时抛出异常。
async_wait
的处理程序先于async_read
的处理程序执行的情况意味着套接字无法在1秒内读取数据。
1. run_one is called
2. handler passed into async_wait is called
3. timer_result is set
4. else if (timer_result) is processed
5. sock.cancel() is called [ cancel() queues handler with error code !!
which indicates that read operation was aborted]
6. handler passed into async_read is queued
传递给 async_read
的处理程序已排队,但何时调用?只能被run_one
调用。如果不调用此处理程序,则无法设置 read_result
。那么,你想如何指示超时无法读取数据的情况? read_result
只能通过在run_one
中调用handler来设置。这就是为什么您需要在循环内处理 run_one
来调用处理程序,该处理程序设置 read_result
可选,错误代码表示读取操作中止。