深入学习 Boost.Asio(三):协程进阶与实战项目

系列导航:入门篇 | 进阶篇 | 实战篇 前置知识 阅读本篇前,请确保已掌握: 入门篇:io_context、异步操作生命周期、定时器 进阶篇:协程 Echo Server、多线程模型、strand 1. 协程进阶技巧 1.1 co_spawn 的第三个参数 co_spawn 的第三个参数决定了协程完成后的行为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 #include <boost/asio.hpp> #include <boost/asio/co_spawn.hpp> #include <boost/asio/detached.hpp> #include <boost/asio/use_awaitable.hpp> using boost::asio::awaitable; using boost::asio::use_awaitable; awaitable<int> compute() { co_return 42; } awaitable<void> mayFail() { throw std::runtime_error("oops"); co_return; } void examples(boost::asio::io_context& ioCtx) { // 方式1:detached —— 忽略返回值和异常 // 适用:独立运行的协程(如连接处理) boost::asio::co_spawn(ioCtx, compute(), boost::asio::detached); // 方式2:回调 —— 协程完成时执行回调 // 适用:需要捕获协程异常或获取返回值 boost::asio::co_spawn(ioCtx, mayFail(), [](std::exception_ptr e) { if (e) { try { std::rethrow_exception(e); } catch (const std::exception& ex) { std::cerr << "协程异常: " << ex.what() << "\n"; } } }); // 方式3:use_awaitable —— 在协程中等待另一个协程 // 适用:父子协程关系 // (需要在协程内使用) } // 方式3 完整示例 awaitable<void> parent(boost::asio::io_context& ioCtx) { // 等待子协程完成并获取返回值 int result = co_await boost::asio::co_spawn( ioCtx, compute(), boost::asio::use_awaitable); std::cout << "子协程返回: " << result << "\n"; // 42 } 1.2 超时控制 生产环境中,你不能无限等待一个操作完成。Asio 提供了 awaitable_operators 实现竞争式等待: ...

May 21, 2025 · 10 min · 1926 words

Lua 内存泄漏排查实战:从 GC 原理到线上定位

Lua 内存分析与泄漏排查 适合读者:需要排查线上 Lua 内存泄漏、分析 GC 压力的开发者 本文以 Lua 5.3/5.4 为基础,结合游戏服务器实际场景 第一章:Lua 内存管理概览 1.1 Lua 的内存模型 Lua 的内存管理采用自动垃圾回收(GC),开发者不需要手动分配/释放内存。所有对象(Table、Function、String、Userdata)都由 GC 统一管理。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Lua 进程内存分布: ┌─────────────────────────────────────┐ │ C 层面分配(lua_newstate) │ ← Lua State 本身 ├─────────────────────────────────────┤ │ Lua 栈(lua_stack) │ ← 每个 lua_State 的栈空间 ├─────────────────────────────────────┤ │ GC 对象(可回收) │ ← Table, Function, String, Userdata │ ├── Table │ │ ├── Function (闭包) │ │ ├── String (短字符串/长字符串) │ │ ├── Userdata │ │ └── Thread (协程) │ ├─────────────────────────────────────┤ │ GC 元数据 │ ← GC 链表的辅助结构 └─────────────────────────────────────┘ 1.2 Lua GC 的工作方式 Lua 5.3/5.4 使用三色标记-清除(Tri-color Mark-and-Sweep) 算法,分步执行: ...

September 18, 2022 · 17 min · 3599 words

Lua 性能进阶:VM 原理、Table 布局优化与 JIT 编译

Lua 性能进阶:Lua VM 原理、Table 布局优化、JIT 编译优化 适合读者:有一定 Lua 使用经验,想深入理解底层原理并写出高性能 Lua 代码的开发者 本文以 Lua 5.3 为主(项目中的 Lua 5.4 大同小异),JIT 部分以 LuaJIT 为例 第一章:Lua VM 概览 1.1 Lua 是一门什么语言? Lua 是一门动态类型、寄存器式虚拟机的语言。这个定义里最关键的是"寄存器式虚拟机"——它决定了 Lua 的执行模型。 对比一下两种虚拟机模型: 模型 代表 特点 栈式虚拟机 JVM, Python 大部分指令操作栈顶元素 寄存器式虚拟机 Lua, Dalvik 指令直接操作虚拟寄存器(类似 CPU 寄存器) 寄存器式的好处是什么?一条指令能干更多事。比如 a = b + c,Lua 编译器会生成一条 ADD R(a) R(b) R(c) 指令,直接完成;而栈式可能需要 push b; push c; add; pop a 四条指令。 1.2 Lua 程序是怎么跑起来的? 1 源代码 → 词法分析 → 语法分析 → 字节码生成 → VM 执行 我们写一段 Lua 代码,看看它编译成什么样子: ...

September 10, 2022 · 27 min · 5724 words