【问题标题】:Boost::asio concurrency (?)Boost::asio 并发(?)
【发布时间】:2011-07-11 11:54:43
【问题描述】:

我正在编译 boost::asio 示例: http://www.boost.org/doc/libs/1_46_1/doc/html/boost_asio/examples.html#boost_asio.examples.http_server_3

它应该是一个多线程的服务器实现。

现在,在 async_read 处理程序中,我打印一条消息并休眠 30 秒。我在两个浏览器中打开 localhost,看到调用了一次 handle_read,然后 30 秒没有任何反应,最后第二次调用了 handle_read。

io_Service.run 使用 5 个线程调用。

为什么不同时调用处理程序?例如为什么在调用第二个之前等待第一个 handle_read 完成?

【问题讨论】:

  • 向我们展示您的代码。我敢打赌,您要等到睡眠之后才注册新的侦听器。
  • 您是否在睡眠前从句柄启动新的 async_read()?
  • 是的,我将睡眠放在新的 async_read 之前。 boost.org/doc/libs/1_46_1/doc/html/boost_asio/example/http/… 基本上紧跟在 if( ! e ) 之后。我认为它的工作方式是每个连接都有效。所以我想处理客户端1的数据,只有在处理完成后才接收新数据。但是在处理客户端 1 时,我也想处理客户端 2。
  • 你只在一个插座上做?如果您有 2 个不同的客户端,则需要 2 个不同的套接字。对于每一个你需要调用 async_read() - 所以它们将是独立的。
  • 在handle_accept中:new_connection_->start();为每个新连接调用,它调用async_read,然后调用async_accept等待另一个连接。在handle_read(由async_read 注册)中,请求被处理,然后再次调用async_read 来注册handle_read。所以调用是在两个套接字中独立进行的。

标签: c++ boost concurrency boost-asio


【解决方案1】:

它有助于发布代码。当我对 asio 示例使用此修改时:

void connection::handle_read(const boost::system::error_code& e,
    std::size_t bytes_transferred)
{
  std::cerr << "connection::handle_read()\n";
  boost::this_thread::sleep(boost::posix_time::seconds(10));
  std::cerr << "connection::handle_read() done sleep\n";
  if (!e)
  {

它按预期工作,即

$ ./test 0.0.0.0 7777 5 .
connection::handle_read()
connection::handle_read()
connection::handle_read() done sleep
connection::handle_read() done sleep

你如何“睡 30 秒”?也许您使用的 sleep 功能会暂停进程中的所有线程?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2021-11-07
    • 1970-01-01
    相关资源
    最近更新 更多