【发布时间】:2012-05-18 20:00:38
【问题描述】:
我正在使用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 是否能够在读取另一个套接字时连接到一个套接字?
另一个例子是,如果我在我的主函数中一个接一个地调用 2 Async Connect:
SocketA->AsyncConnect();
SocketB->AsyncConnect();
假设来自 SocketA 的主机有点慢,需要两秒钟才能回答。因此,当 SocketA 尝试连接时,SocketB 会同时连接还是必须等到 SocketA 完成/超时?
【问题讨论】:
-
我不确定是否能完全理解您的问题,但我会说 Asio 会尽快以未指定的顺序引发连接或写入事件,以先到者为准。如果我可以问,为什么你认为顺序很重要?
-
@ereOn 我在问题中添加了一些内容以使其更精确
标签: c++ sockets boost boost-asio