【问题标题】:Boost async_read_some not exactly asynchronous提升 async_read_some 不完全是异步的
【发布时间】:2012-06-20 03:28:11
【问题描述】:

这是我的服务器代码:

socket_.async_read_some(boost::asio::buffer(data_read.data(), Message::header_length),
    boost::bind(&TcpConnection::handle_read_header, shared_from_this(),
    boost::asio::placeholders::error));

如果我在循环中编写以下代码

boost::thread::sleep(boost::posix_time::seconds(2));

在上面的'async_read_some'调用的'handle_read_header'函数中,整个线程正在等待直到睡眠结束。因此,当另一个请求进来时,它不会被处理,直到睡眠结束。是不是假设异步处理每个请求?我是 boost 和 C++ 的新手。如果我提到了任何错误,请告诉我。

【问题讨论】:

  • 实际上,即使在“休眠”时,Boost::asio 仍然会继续异步读取。只是,如果处理程序正在运行并且您只使用一个线程,Asio 无法通知您读取完成。您希望它的表现如何?
  • @ereOn 你是说我在“handle_read_header”中调用的方法应该在不同的线程中吗?和 ereOn 不是 async_read_some 为每个处理程序创建新线程吗?
  • @ereOn 如果我在线程完成时调用处理程序内的线程,则套接字可能已被新请求更改。
  • Boost Asio 文档指出,所有回调(处理程序)都将从调用 io_service::run() 的完全相同的线程中调用。没有其他的。 Asio 是使用线程还是 select() 来处理异步读/写对您来说并不重要,因为从用户的角度来看,它的行为仍然相同。也就是说,如果你在单线程中调用io_service::run(),你不能指望同时调用处理程序。

标签: c++ boost boost-asio shared-ptr boost-thread


【解决方案1】:

以async_read_some 调度的读取是在名为io_service::run() 的线程中实现的。 如果您只有一个线程它将等待完成一个读取处理程序,然后再启动另一个。

您可以通过使用io_service::run() 运行更多线程或缩短读取处理程序的执行时间来创建线程池。

【讨论】:

  • 感谢您的快速回复,我尝试了 'io_service::run()' 但它似乎无法正常工作。但是是的,我正在尝试缩短读取处理程序的执行时间。
  • @Navin 什么工作不正常?也许您没有同步对共享变量的访问?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多