【发布时间】: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