我boost::asio::io_service
用来管理一些异步 TCP 通信。这意味着我创建一个boost::asio::ip::tcp::socket
并给予io_service
它。当我开始通信时,它的示意图如下:
Async Resolve -> Callback -> Async Connect -> Callback -> Async Write -> Callback -> Async Read
我省略了解析和绑定等部分。假设 Socket 已经绑定到一个端口并且主机名被解析(所以 connect 意味着建立到端点的真实连接)
现在的重点是我可以用同一个io_service
对象启动多个异步连接。这意味着,例如,虽然在我的io_service
线程中程序即将获取Async Write
一些数据,但主线程将调用Async Resolve
on Socket (但使用相同的io_service
)。这意味着我io_service
现在有一些并行工作要做 - 我想知道它将如何优先处理工作?
例如它是这样的
Main Thread | io_service Thread
-------------------------+-----------------------------------------------
SocketA->Async Connect |
//Some other Stuff | SocketA->Callback from Async Connect
| SocketA->Async Write
SocketB->Async Connect |
| --> ?
现在在这一点上,我不得不承认我不太确定它是如何io_service
工作的。在第四行中,现在需要执行两个不同的异步函数。
是否io_service
能够Async Connect
同时Async Write
进行?如果是这种情况,很明显总是会调用首先完成的函数的回调。
如果io_service
没有能力这样做,它将按什么顺序完成工作?如果SocketA Async Write
将首先调用,它的回调也将首先被调用。实际上,在 SocketA 上的整个操作完成之前,总会有工作。
编辑 :
根据 ereOns 的评论,我试图让我的问题更加准确:
从io_service
线程的角度来看——SocketA Async Connect
调用是异步的还是同步的?从我的主线程的角度来看,它当然是异步的(它只是调度命令然后继续)。但是在io_service
线程中这个特定的Connect
调用会阻塞其他操作吗?
换句话说:一个io_service
人在读取另一个套接字时是否能够连接到一个套接字?
另一个例子是,如果我Async Connect
在我的 main 函数中一个接一个地调用 2:
SocketA->AsyncConnect();
SocketB->AsyncConnect();
假设来自 SocketA 的主机有点慢,需要两秒钟才能回答。因此,当 SocketA 尝试连接时,SocketB 会同时连接还是必须等到 SocketA 完成/超时?