c++ - Boost ASIO - 什么是异步

标签 c++ boost asynchronous boost-asio

我读了很多书,但我还是无法理解 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/

相关文章:

c++ - 我什么时候应该在智能指针上使用原始指针?

c++ - 如何从文件中读取 UTF 符号,就好像它们是 UTF 代码一样?

JavaScript:如何确保此函数仅返回完全填充的数组?

javascript - 在 Controller 异步调用后添加 CSS 样式的首选 AngularJS 方式是什么?

c++ - GMP 错误的朴素素数算法 c++

c++ - 引用 Lambda

c++ - 如何使用 boost::thread 创建线程池

javascript - 将 Deferred 添加到非异步函数

c++ - 为什么ADL对运算符(operator)功能的行为不同于其他功能?

c++ - 无法编译简单的 C++ 程序