Asio
围绕 Proactor、io_context 和跨平台异步 I/O 的系列文章。
-
asio(六):十大陷阱与生产实践
Asio 最常见的 bug 源头是对象生命周期(异步操作引用了已析构的对象)和缓冲区生命周期(buffer 底层内存在操作完成前被释放)。strand 不是锁但胜似锁——用错了比不用更危险。timer 取消的语义和直觉不一致。这篇列出 10 个陷阱和 7 条生产 checklist。
-
asio(五):操作系统I/O多路复用-epoll、kqueue、IOCP如何被统一
Asio 通过编译期条件选择 reactor 实现(epollreactor / kqueuereactor / winiocpiocontext),每种实现共享统一的内部接口(registerdescriptor、startop、cancelops、run、interrupt)。Linux/macOS 是 Reactor 之上模拟 Proactor,Windows 是原生 Proactor 直通 IOCP。io_uring 作为第四种后端在 Boost 1.78+ 可选启用。
-
asio(四):异步模型演进-从回调到C++20协程
Asio 的异步操作只写一次实现,通过 asyncresult<CompletionToken, Signature> trait 自动适配回调、stackful 协程、stackless 协程、C++20 协程和 future。这是 Asio 最精妙的设计——一个 asyncread 实现同时支持五种异步风格,新增风格只需特化一个 trait。
-
asio(三):组件拆分-strand、timer、socket、buffer如何协作
Asio 的组件设计遵循一个原则:I/O 对象不拥有资源(缓冲区、线程),只持有操作系统句柄和执行器引用。strand 解决多线程序列化问题,timer 集成进 reactor 的等待超时,socket 分层抽象协议差异,buffer 是纯粹的指针+长度对。这些组件通过共享同一个 io_context 和执行器模型自然组合。