asio :: io_context :: run_one()与while()

时间:2019-02-01 16:47:17

标签: c++ boost asio

在以下代码中使用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);
  }

1 个答案:

答案 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设置为可选,并带有指示读取操作中止的错误代码。