gpt4 book ai didi

c++ - 启动 boost::asio::io_service 时的例程

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:35 25 4
gpt4 key购买 nike

我想使用 boost asio 创建一个 http 客户端。为了结构化和优化,我研究了 boost asio 的示例,以了解一个好的实现应该是什么样子。

大多数情况下,我遵循了 HTTP Server 的结构,所以我有一个连接管理器,它包含一组指向每个单独连接的指针。现在,这里最大的区别是已经在 server.cpp 的构造函数中调用了一个异步函数,即

acceptor_.async_accept(new_connection_->socket(),      boost::bind(&server::handle_accept, this,        boost::asio::placeholders::error));

在 winmain.cpp 中,io_service 是通过对 server::run() 的函数调用启动的:

io_service_.run();

在我的实现中,因为它是客户端而不是服务器,所以我想在开始连接到服务器之前等待用户调用 send() 函数。因此,我已将所有与连接到服务器相关的函数调用移动到连接类中。当用户请求向服务器发送消息时,将调用以下内容:

resolver.async_resolve(query,                                   boost::bind(&connection::handle_resolve, boost::ref(*this),                                               boost::asio::placeholders::error,                                               boost::asio::placeholders::iterator));io_service_.run();

我想在一个单独的线程中启动每个连接对象,这确实是我的问题的背景。我该怎么做才能获得结构化和优化的代码?

我试过了,如HTTP Server 2例如,设置一个 io_services 线程池并为它们分配工作,以便它们在停止之前不会返回。这似乎是个好主意,因为我会让 io 服务一直在后台运行。因此,我从相当于 server.cpp 的线程中启动线程池:

boost::thread t(boost::bind(&geocast::enabler::io_service_pool::run, &io_service_pool_));

但是,根据我自己的试错分析,似乎您无法在发出异步函数之前启动 io_service,是这样吗?因为我的程序卡住了。在我的例子中,我只想在用户打算发送 POST 请求或 GET 请求时调用 async_resolve。支持我的理论; Chat Client通过调用 async_connect 并使用 async_read 作为回调开始,这样他们就可以在客户端创建后安全地调用 io_service.run() 。我不想为了能够启动 io_service 而一直从服务器读取数据,因为这不是普通客户端的工作方式,对吗?如果用户没有导航到网站,浏览器不会从地球上所有可能的服务器读取数据...

如果我不使用示例 2 中的线程池,而是在单独的类中启动每个连接类,每个连接类都拥有自己的 io_service,则一切正常。但是,具有简单循环例程来选择合适的 io_service 的线程池似乎非常有吸引力。我使用多线程的最佳方法是什么?我是不是太挑剔了,应该坚持一个连接一个 io_service 的东西?

最佳答案

I have tried, as HTTP Server 2 example, to set up a thread pool of io_services and assigning work to them so that they will not return until stopped.

在使用异步编程时,我强烈建议按顺序使用以下设计:

  1. 单线程io_service
  2. 调用单个 io_service 的线程池
  3. io_service 每线程或其他奇特的设计

只有在分析之后证明您当前的设计是瓶颈时,您才应该转向下一个设计。

BUT, from my own trial and error analysis, it seems as you cannot start io_service BEFORE you have issued an asynchronous function, is that true?

你是对的,io_service::run() documentation说的很清楚

The run() function blocks until all work has finished and there are no more handlers to be dispatched, or until the io_service has been stopped.

防止 io_service::run() 立即返回的正确方法是排队一些处理程序,或实例化一个 io_service::work object并在您希望 run() 保持事件状态时将其保持在范围内。

关于c++ - 启动 boost::asio::io_service 时的例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6014644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com