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 Connect
和Async 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完成/超时?
所有工作都在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 的全部优点:它会在更合适的时候非常小心地处理轮询、等待和引发事件,从而为您留下“简单”的部分。
归档时间: |
|
查看次数: |
2349 次 |
最近记录: |