我一直在做很多阅读,但我无法理解Boost ASIO中同步和异步调用之间的区别:它们是什么,它们是如何工作的,以及为什么选择一个而不是另一个
我的模型是一个服务器,它接受连接并将新连接附加到列表。一个不同的线程在列表上循环,并在每个已注册的连接数据可用时发送它们。每次写操作都应该是安全的。它应该有一个超时,以便它不能挂起,它不应该分配任意大量的内存,或者通常导致主应用程序崩溃。
混乱:
accept_async
与常规accept
的区别如何?是否接受为每个连接分配的新线程?从示例中我可以看到,在接受连接后,会调用请求处理程序。此请求处理程序必须告知接受者准备再次接受。没有什么关于这似乎异步。如果requset处理程序挂起,则接受器阻塞。
在the boost mailing list中,OP被告知使用async_write
使用计时器而不是常规write
。在此配置中,我没有看到任何异步行为或为什么会推荐它们。从Boost文档async_write
看起来比write
更危险,因为用户在完成第一个文档之前不得再次调用async_write
。
答案 0 :(得分:3)
异步调用立即返回。
这是重要的一点。
现在,如何控制异步操作完成后发生的“下一件事”?你知道了,你提供完成处理程序。
异步的优势在于您可以在后台运行IO操作(或类似操作),而不会产生任何线程切换或同步开销。这样,您就可以在一个线程上同时处理许多异步控制流。
实际上异步操作可能更复杂并且需要更多思考(例如,关于完成处理程序中使用的引用的生命周期)。但是,当您需要它时,您需要它。答案 1 :(得分:0)
来自官方网站的Boost.Asio基本概述解释得很好:
http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/overview/core/basics.html
io_service对象处理多个操作。
应该仔细调用io_service.run()(这可以解释"危险的async_write")