Old*_*bie 19 c++ asynchronous tcp synchronous boost-asio
据我所知,同步和异步操作之间的主要区别.即write()或read()VS async_write()并且async_read()是前者,不返回,直到操作完成-或无差错,以及最后的,立即返回.
由于异步操作由一个io_service.run()在受控操作完成之前未完成的操作控制.在我看来,顺序操作中涉及与POP3等协议的TCP/IP连接,其中操作是如下序列:
C: <connect>
S: Ok.
C: User...
S: Ok.
C: Password
S: Ok.
C: Command
S: answer
C: Command
S: answer
...
C: bye
S: <close>
Run Code Online (Sandbox Code Playgroud)
同步/异步运算符之间的区别没有多大意义.
当然,在这两种操作中,总是存在程序流程在某些情况下无限期停止的风险 - 使用计时器 - 但我想知道一些更多的授权意见.
我必须承认这个问题定义不明确,但我想听听一些关于何时使用其中一个的建议.我在使用MS Visual Studio调试关于我正在使用的POP3客户端中的异步SSL操作时遇到了问题,有时候认为在这个问题上使用异步可能是个坏主意.
Sam*_*ler 34
该Boost.Asio的文件确实一个梦幻般的工作,解释两个概念.正如拉尔夫所说,克里斯也有一个描述异步概念的博客.解释超时如何工作的停车计时器示例特别有趣,如绑定说明示例.
首先,考虑同步连接操作:

控制流程在这里相当简单,您的程序调用一些API(1)来连接套接字.API使用I/O服务(2)在操作系统(3)中执行操作.一旦完成此操作(4和5),控制将立即返回到您的程序(6),并指示成功或失败.
类似的异步操作具有完全不同的控制流程:

在这里,您的应用程序使用相同的I/O服务(2)启动操作(1),但控制流程被反转.完成操作会导致I/O服务通过完成处理程序通知您的程序.步骤3和操作完成之间的时间完全包含在同步情况的连接操作中.
您可以看到同步案例对于大多数程序员来说自然更容易掌握,因为它代表了传统的控制流程范例.通过异步操作所使用的反转的控制流程是很难理解,它常常迫使你的程序拆分业务并入start与handle其中的逻辑是围绕转变方法.但是,一旦您对此控制流程有了基本的了解,您就会意识到这个概念实际上有多强大.异步编程的一些优点是:
将线程与并发分离.进行长时间运行操作,对于同步情况,您通常会创建一个单独的线程来处理操作,以防止应用程序的GUI无响应.这个概念在小范围内工作正常,但很快就会在少数线程中崩溃.
提高绩效.每个连接的线程设计根本无法扩展.请参阅C10K问题.
作文(或链接).更高级别的操作可以由多个完成处理程序组成.考虑传输JPEG图像,协议可能规定前40个字节包括描述图像大小,形状的标题,也许还有一些其他信息.发送此标头的第一个完成处理程序可以启动第二个操作以发送图像数据.更高级别的操作sendImage()不需要知道或关心用于实现数据传输的方法链接.
超时和取消能力.有特定于平台的方法可以超时长时间运行(例如:SO_RCVTIMEO和SO_SNDTIMEO).使用异步操作可以deadline_timer在所有支持的平台上使用取消长时间运行的操作.
当然,在这两个操作中总是存在程序流程由某些环境无限期地停止的风险 - 使用计时器 - 但我想知道在这个问题上有一些更多的授权意见.
我使用Asio的个人经验源于可扩展性方面.在处理有限的资源(如内存,线程,套接字等)时,为超级计算机编写软件需要相当多的小心.使用每个连接的线程约200万个同时操作是一种在到达时死机的设计.
我认为同步/异步的选择是非常特定于应用程序的。我同意异步范例可以使代码和调试变得更加复杂,但它确实有其好处。
为了说明这一点,我们从同步 IO 切换到使用异步 IO 的 boost asio 的主要原因是,在我们的应用程序中,阻塞 IO 不是一个选项,我们有一个多媒体流服务器,在其中我将媒体数据包流式传输到多个客户端。编码。问题在于网络问题导致整个捕获-编码-传送管道实际上陷入停滞(例如,如果与单个客户端的连接失败)。
总而言之,根据我 (ltd) 使用异步 IO 的经验,当您在等待 IO 完成时需要完成其他工作(例如为其他客户端提供服务等)时,它会很有用。在需要等待IO结果才能继续的系统或者场景中,直接使用同步IO会简单很多。
它在双工通信系统中也有意义(例如,更复杂的协议,如 SIP、RTSP,其中客户端和服务器都可以发送请求)。自从我处理 POP 以来已经有一段时间了,但是对于您示例中的简单交换,异步 IO 可能被认为是矫枉过正。只有当我确定同步 IO 不足以满足我的要求时,我才会切换到异步 IO。
在查阅 boost asio 文档时,我发现掌握它的最佳方法是通过示例。另外,您可能想查看的链接是http://en.highscore.de/cpp/boost/index.html它有一个关于 boost asio 的非常好的章节。Chris Kohlhoff(asio 的作者)博客上也有一些非常优秀的文章值得一读。