在以下代码中使用while
时,为什么需要asio::io_context::run_one()
循环?如果我们不像下面这样使用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);
}
答案 0 :(得分:0)
您需要使用while循环来处理所有处理程序,以在发生超时并且在此超时时间内无法读取数据时引发异常。
eval_config: {
num_examples: 57
visualization_export_dir: "bevelgear_training/eval_images/"
num_visualizations: 57
metrics_set: "pascal_voc_detection_metrics"
}
的处理程序在async_wait
的处理程序之前执行的情况意味着套接字无法在1秒钟内读取数据。
async_read
传递到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
的 handler已排队,但是何时调用?只能由async_read
调用。如果未调用此处理程序,则无法设置run_one
。那么,您如何发信号通知一段时间无法读取数据的情况?只能通过调用read_result
内部的处理程序来设置read_result
。这就是为什么您需要在循环内处理run_one
来调用处理程序,该处理程序将run_one
设置为可选,并带有指示读取操作中止的错误代码。