我正在使用boost::asio::io_service
来管理某些异步TCP通信。这意味着我创建了一个boost::asio::ip::tcp::socket
并给它io_service
。当我开始通信不言而喻示意图如下:boost :: asio :: io_service如何优先工作?
Async Resolve -> Callback -> Async Connect -> Callback -> Async Write -> Callback -> Async Read
我ommitted喜欢决心和绑定的部分。假设Socket已被绑定到端口并且主机名已解析(因此连接意味着建立与端点的真实连接)
现在重点是我可以用同一个io_service
对象启动多个异步连接。这意味着,例如,在我的io_service
线程中,程序中的某些数据即将到达Async Write
,主线程将在Socket上调用Async Resolve
(但具有相同的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完成/超时?
我不知道,完全让你的问题,但我会说短耳将尽快引发事件,无论是连接或写,以先到者为准,未指定顺序。如果我可能会问,为什么你认为订单很重要? – ereOn
@ereOn我在问题中添加了一些内容以使其更精确 – Toby