c++ - io_context 到底是什么?
问题描述
我一直在浏览 boost asio 库,其中大多数对象都需要 io_context 对象作为构造函数的参数。我已经阅读了什么 io_context 对象,根据文档说明它是
io_context 类为异步 I/O 对象的用户提供核心 I/O 功能
这让我感到困惑,因为这不是iostream所做的。我真的很确定我遗漏了一些东西,请帮我澄清一下,而且我没有看到I/O 对象与套接字之间有太大区别,除了套接字的事实可用于在两个设备之间交换数据,而 I/O 对象使我们能够与我们的计算机交换数据。此时我真的很困惑!
解决方案
io_context
包含运行基于 、 或其他平台特定调用的事件循环所需的状态select
,epoll
并将诸如套接字就绪、计时器、信号、空闲等事件分派到用户已注册的回调。不同套接字、计时器等的许多回调可以用一个注册io_context
。io_context
不做 I/O,但是当 I/O 可以以非阻塞方式完成时,它会调用那些回调,例如数据已经到达并且套接字准备好读取,并且回调执行实际的非阻塞 I/O .
有关详细信息,请参阅Basic Boost.Asio Anatomy 。
C10K 问题很老,但对异步 I/O 的主题很有启发性。
C++20 协程引入了一种新的编程模型,它的优点是更易于编写和读取,并减轻了非阻塞 I/O 代码中固有的回调地狱。Boost.Asio 支持协程。
推荐阅读
- javascript - 获取post json,标题有时会消失
- node.js - 如何将节点应用程序的更改推送到 Amazon EC2
- azure - Azure AD B2C 自定义策略语言翻译
- typescript - 生产模式下的 Webpack4 + Typescript5 源映射异常
- docker - Windows 10 Docker 与 VBox 悖论。除非禁用 Hyper-V,否则 Virtual Box 不会运行,除非启用 Hyper-V,否则 Docker 不会启动
- javascript - 从网页检测客户端系统上是否安装了桌面应用程序
- javascript - 如何在 Kotlin 的 JS 接口中使用可选参数调用
- xslt - XSLT:“在样式表编译期间报告了错误”出现在 Oxygen 工具中
- kubernetes - 从 Kubernetes 中的一组候选 pod 中选举领导者的正确方法
- python - 将 Pandas Dataframe 与 Python 中的集合进行比较