我读了很多书,但我还是无法理解 Boost ASIO 中同步和异步调用之间的区别:它们是什么,它们如何工作,以及为什么要选择一个而不是另一个。
我的模型是一个接受连接并将新连接附加到列表的服务器。一个不同的线程遍历列表并在每个注册的连接数据可用时发送它。每个写操作都应该是安全的。它应该有一个超时,这样它就不会挂起,它不应该分配任意大量的内存,或者通常导致主应用程序崩溃。
困惑:
accept_async
与常规 accept
有何不同?是否为接受的每个连接分配了一个新线程?从我看到的示例来看,在接受连接后,会调用请求处理程序。这个请求处理程序必须告诉接受者准备再次接受。这一切似乎都是异步的。如果请求处理程序挂起,则接受器将阻塞。
在the boost mailing list OP 被告知使用带有计时器的 async_write
而不是常规的 write
。在此配置中,我没有看到任何异步行为或为什么会推荐它们。从 Boost 文档来看,async_write
似乎比 write
更危险,因为用户不能在第一个完成之前再次调用 async_write
。
最佳答案
异步调用立即返回。
这是重要的一点。
现在您如何控制异步操作完成后发生的“下一件事”?您知道了,您提供了完成处理程序。
异步的优势在于,您可以让 IO 操作(或类似操作)“在后台”运行,而不必产生任何线程切换或同步开销。通过这种方式,您可以在单个线程上同时处理许多异步控制流。
事实上,异步操作可能更复杂,需要更多思考(例如,关于完成处理程序中使用的引用的生命周期)。但是,当您需要它时,您就需要它。
关于c++ - Boost ASIO - 什么是异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24745222/