在阅读asio的文档后,我很清楚完成处理程序是由一个调用io_service的io.run()
方法的线程调用的。但是,我不清楚的是读/写异步方法发生在哪个线程。它是我调用方法的线程还是在调用io.run()
方法的一个线程中?或者,在最后一种情况下,库是否在幕后创建另一个线程并执行操作?
答案 0 :(得分:0)
例如,您希望将一些数据发送到远程伙伴 - 异步。
boost::asio::async_write(_socket, boost::asio::buffer(msg.data(), msg.size()),
std::bind(&Socket::WriteHandlerInternal, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2));
//Where 'this' is the class Socket
在此之前,您可能已经创建了一个名为ioService.run()
的线程。 async_write
函数将使用您用于创建套接字的ioService
。它将ioService
的队列放入执行写操作和处理程序 - 在ioService
运行的线程上,正如async_
已经建议的那样。
答案 1 :(得分:0)
将在初始async_*
功能中尝试I / O操作。如果满足操作的完成条件或发生错误,则操作完成,完成处理程序将发布到io_service
。否则,操作未完成,它将被排入io_service
,其中运行io_service
函数的应用程序线程poll()
,poll_one()
,{{1 }或run()
执行基础I / O操作。在这两种情况下,完成处理程序都由处理run_one()
。
async_write()
文档指出异步操作可以立即完成:
无论异步操作是否立即完成,都不会从此函数中调用处理程序。调用处理程序的调用将以与使用
io_service
等效的方式执行。
Requirements on Asynchronous Operations文档中也注明了这种行为:
当异步操作完成时,将按以下方式调用操作的处理程序:
- 为处理程序构建绑定完成处理程序
boost::asio::io_service::post()
...- 调用
bch
来安排延迟调用的处理程序......这意味着不能直接从启动函数中调用处理程序,即使异步操作立即完成。
以下是此行为的完整示例demonstrating。其中,ios.post(bch)
和socket1
已关联。最初,socket2
没有可用的数据。但是,在调用socket2
之后,即使async_write(socket1, ...)
尚未运行,socket2
也有数据:
io_service