【问题标题】:Correct usage of boost::asio for a multi-client process为多客户端进程正确使用 boost::asio
【发布时间】:2012-05-21 05:32:49
【问题描述】:

我第一次尝试使用 boost::asio 编写一个连接到 N 个服务器的进程从它们读取数据。

我的问题是关于异步的工作方式。我的设计目标是并行连接到所有服务器,并从每个服务器并行读取数据。这应该通过 async_connect 和 async_read 完成,并调用 io_service::run() N 次,然后读取结果。问题是:从单个线程依次调用 io_service::run() 是否足以实现并行性?

请注意,这是 asio 的实现问题:具体来说,当调用 connect_async 和 write_async 时,调用是否会在返回之前向操作系统发出开始连接/读取的信号,或者它只是将同步的连接/读取任务委托给工作线程并立即返回? - 从单个线程调用 io_service::run() 意味着串行执行任务的情况。

当然,我的猜测是前者,但我需要有人确认。我发现异步内容的文档(http://think-async.com/Asio/boost_asio_1_3_1/doc/html/boost_asio/overview/core/basics.html)没有提到 async_xxx 调用何时返回,这会澄清我的问题。

【问题讨论】:

    标签: boost asynchronous parallel-processing boost-asio


    【解决方案1】:

    asio 的核心是一个事件循环,它从调用io_service::run() 开始,这是一个阻塞调用。当您调用async_connect 时,您会将连接操作排入io_services 事件队列。要实现并行性,您必须创建一个线程池并让每个线程在同一个 io_service 实例上调用 run()

    【讨论】:

    • 不太确定这是否正确,即您可能不会从多个线程调用 run() 并且仍然通过诸如 I/O 完成端口等操作系统机制实现并行性(不确定情况是否如此我的连接电话) - 任何人都可以确认这一点吗?
    • 在操作系统级别,它是并发的(boost.org/doc/libs/1_49_0/doc/html/boost_asio/overview/core/…),在应用程序级别,它是串行的。异步调用会立即返回并将 I/O 操作推迟到操作系统,但您的完成处理程序将串行运行。顺便说一句,如果您只在应用程序中使用单个线程,则不应多次调用 io_service::run
    • 酷,这就是我的想法(即连接是并行的,完成处理程序是串行的 - 显然因为它们是从单个线程调用的)。要回答最后一个问题,你说得对,我实际上是在调用run_one() N 次,而不是run()。谢谢!
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2016-06-19
    • 2012-02-14
    相关资源
    最近更新 更多