【问题标题】:What does boost::asio::io_service::run() actually do?boost::asio::io_service::run() 实际上做了什么?
【发布时间】:2019-01-29 07:27:59
【问题描述】:

我已经实现了一个 TCP 套接字客户端,它连接到服务器并使用 boost::asio::read()boost::asio::write() 调用。

有点像这样:

https://www.boost.org/doc/libs/1_63_0/doc/html/boost_asio/example/cpp11/chat/chat_client.cpp

但是,在我的实现中,我根本没有调用boost::asio::io_service::run(),并且套接字读/写仍然有效。在套接字客户端的上下文中,该服务的目的是什么?我需要运行服务吗?

【问题讨论】:

  • 所以您的代码中没有像std::thread t([&io_service](){ io_service.run(); }); (从您链接到的源代码复制)这样的行吗?您能否创建一个minimal reproducible example您的代码给我们看?
  • 我的客户端正在使用 Qt 的事件循环,它只是实例化了服务。我的问题是 run 方法有什么作用?那是异步操作的事件循环吗?
  • io_service::run 处理处理程序。处理程序是由在异步模式下工作的函数创建的,例如 async_readasync_write,这些函数会立即返回,在您的情况下,asio::read 不会创建任何处理程序,它是阻塞函数,因此无需运行 @ 987654331@ 调用处理程序。
  • @rafix07 我想你的意思是asio::read?请将其转换为答案:)
  • @juzzlin 是的,是错字。

标签: c++ boost boost-asio


【解决方案1】:

io_service::run 处理处理程序。处理程序由有效的函数创建 在异步模式下,如async_readasync_write。这些函数立即返回。 处理程序已排队,函数返回,io_service::run 稍后处理此处理程序。 在您的情况下,asio::read 没有创建任何处理程序,它是阻塞函数,因此无需调用 io_service::run

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多