boost :: asio :: io_service如何优先工作?

Tob*_*oby 7 c++ sockets boost boost-asio

boost::asio::io_service用来管理一些异步TCP通信.这意味着我创造了一个boost::asio::ip::tcp::socket并给予io_service它.当我开始沟通时,它会像这样示意:

Async Resolve -> Callback -> Async Connect -> Callback -> Async Write -> Callback -> Async Read

我省略了像resolve和bind这样的部分.假设Socket已绑定到端口并且主机名已解析(因此连接意味着建立与端点的真实连接)

现在重点是我可以使用相同的io_service对象启动多个异步连接.这意味着,例如,虽然在我的io_service线程中程序是关于Async Write某些数据,主线程将Async Resolve在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   |      
                         |     --> ?
Run Code Online (Sandbox Code Playgroud)

现在,在这一点上,我不得不承认我不太确定它是如何io_service工作的.在第四行中,现在有两个不同的异步函数需要执行.

io_service能够做的Async ConnectAsync Write同步?如果是这种情况,很明显始终会调用首先完成的函数的回调.

如果io_service能够这样做,其中为了将它做的工作?如果SocketA Async Write首先调用它,它的回调也将首先被调用.实际上,在SocketA的整个操作完成之前总会有效.

编辑:

根据ereOns的评论,我试着让我的问题更准确一些:

io_service线程的角度来看- 是SocketA Async Connect调用异步还是同步?从我的主线程的角度来看,它当然是异步的(它只是调度命令然后继续).但是在io_service线程中这个特定的Connect调用会阻塞其他操作吗?

换句话说:io_service当一个Socket在另一个Socket上读取时,是否能够连接到一个Socket?

另一个例子是如果我只是Async Connect在我的主函数中直接调用2 :

SocketA->AsyncConnect();
SocketB->AsyncConnect();
Run Code Online (Sandbox Code Playgroud)

假设来自SocketA的主机有点慢,需要两秒钟才能回答.因此,虽然SocketA试图连接,同时SocketB也会连接,还是必须等到SocketA完成/超时?

ere*_*eOn 4

所有工作都在io_service.run()运行的线程中完成。

async_但是,对任何方法的调用都不会io_service.run()阻塞此特定线程:它的行为与在多个事件上调用时完全相同select(),并且每当引发此类事件时都会“返回”(调用回调)。也就是说,如果您调用:

socketA->async_connect();
socketB->async_connect();
Run Code Online (Sandbox Code Playgroud)

socketB也可以先连接socketA,然后首先调用关联的回调,仍然在线程io_service.run()运行中。

这就是 Boost Asio 的全部优点:它会在更合适的时候非常小心地处理轮询、等待和引发事件,从而为您留下“简单”的部分。